ack / grep suchen und nach Änderungsdatum sortieren

7

Gibt es eine Möglichkeit, ackdie gefundenen Ergebnisse nach Änderungsdatum zu sortieren? (Idealerweise wird das Datum neben dem Ergebnis angezeigt?). Es sieht nicht so aus, als hätte ackes eine Datumsoption, aber nur für den Fall.

Wenn dies mit nicht möglich ist ack, wie wäre es dann mit grepoder mit einer Kombination von Werkzeugen?

Josh
quelle
2
Hallo, ich bin der Autor von ack. Es gibt keine solche Option, obwohl Sie nicht die erste Person sind, die dies wünscht (einschließlich mir). Der Grund, warum ack das nicht kann, ist, dass es die gesamte Liste der Dateien, die es durchsuchen würde, auf einmal laden und sie dann alle nach Datum sortieren und dann alle Dateien erneut durchgehen müsste. Was wäre, wenn Sie 1.000.000 mögliche Dateien in einem Verzeichnis hätten? Sie müssten warten, bis alle 1.000.000 Dateien gescannt und sortiert sind, bevor Sie das erste Ergebnis sehen, und möglicherweise wird Ihnen sogar der Speicherplatz ausgehen, bevor dies passiert ist.
Andy Lester
Danke @AndyLester Das macht Sinn. Ich frage mich, ob das Speichern der Liste unter tmpoder ähnlichem helfen könnte. Das funktioniert möglicherweise nicht für jede Umgebung, aber ich denke, es könnte dieses Problem verhindern.
Josh

Antworten:

7

Weder acknoch grephaben Sie eine Vorstellung von den Änderungsdaten einer Datei. Dazu müssen Sie zuerst die Liste der Dateien erstellen und anschließend danach sortieren.

Sie können xargsdie Ausgabe eines ackoder grepmehrerer Befehle ausführen, die die Änderungsdaten enthalten. Für die Änderungsdaten können Sie dies verwenden stat.

Beispiel

$ grep -Rl awk * | xargs -n 1 stat --printf "%y ------ %n\n"
2013-11-12 10:06:16.000000000 -0500 ------ 100855/tst_ccmds.bash
2013-11-13 00:32:11.000000000 -0500 ------ 100911/cmd.bash
2013-11-23 03:16:17.000000000 -0500 ------ 102298/cmd.bash
2013-12-14 20:06:04.467708173 -0500 ------ 105159/cmd.txt
2013-12-16 03:20:48.166016538 -0500 ------ 105328/cmds.txt
2013-01-14 14:17:39.000000000 -0500 ------ 106932/red5-1.0.1.tar.gz

HINWEIS: Bei dieser Methode werden nur die Namen der Dateien angezeigt, die Ihrer Abfrage entsprechen, sowie das Änderungsdatum.

slm
quelle
4

Mit GNU-Tools:

grep -H something * | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n

Oder,

ack something | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n

Diese nutzt awkden Dateinamen von den üblichen abzuscheiden grepAusgang und awkruft datedie Dateien Datum abzurufen. grepSie können -Hsicherstellen, dass bei der Ausgabe ein Dateiname angezeigt wird, auch wenn nur einer in der Befehlszeile angezeigt wird.

Als Beispiel für die Ausgabe:

$ grep setupcon /etc/init.d/* | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
2011-12-05 12:05 /etc/init.d/keymap.sh:# If setupcon is present, then we've been superseded by console-setup.
2011-12-05 12:05 /etc/init.d/keymap.sh:if type setupcon >/dev/null 2>&1; then
2011-12-08 18:00 /etc/init.d/console-setup:     if setupcon --save; then
2011-12-08 18:00 /etc/init.d/console-setup:test -f /bin/setupcon || exit 0
2012-04-28 02:41 /etc/init.d/kbd:if which setupcon >/dev/null
2012-09-30 18:02 /etc/init.d/keyboard-setup:    if setupcon -k 2>/dev/null; then
2012-09-30 18:02 /etc/init.d/keyboard-setup:test -f /bin/setupcon || exit 0

Erklärung der awkBefehle

  • -F:

    Dadurch wird das Feldtrennzeichen :so festgelegt, dass das erste Feld der Dateiname ist. (Wir müssen hoffen, dass der Dateiname selbst keinen Doppelpunkt enthält.)

  • "date -r \""$1"\" +\"%F %R\"" | getline d

    Dadurch wird date -r filename +"%F %R"das Änderungsdatum der Datei in einer zum Sortieren geeigneten Form abgerufen. Das Datum wird in der Variablen gespeichert d.

  • print d,$0

    Dies druckt die Daten, gefolgt von der Ausgabezeile von grep.

John1024
quelle