ack/grep suchen und nach Änderungsdatum sortieren

ack/grep suchen und nach Änderungsdatum sortieren

Gibt es eine Möglichkeit,ackDie gefundenen Ergebnisse nach Änderungsdatum sortieren? (idealerweise das Datum neben dem Ergebnis anzeigen?). Es sieht nicht so aus, als ob es ackeine Datumsoption gäbe, aber nur für den Fall.

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

Antwort1

Weder acknoch grephaben Sie eine Vorstellung vom Änderungsdatum einer Datei. Dazu müssen Sie zuerst die Liste der Dateien generieren und sie dann danach sortieren.

Sie können xargsdie Ausgabe von entweder ackoder grepin einem anderen Befehl ausführen, der die Änderungsdaten bereitstellt. Für die Änderungsdaten können Sie statdazu verwenden.

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

NOTIZ:Bei dieser Methode werden Ihnen nur die Namen der Dateien zusammen mit dem Änderungsdatum angezeigt, die Ihrer Abfrage entsprechen.

Antwort2

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

Dies dient awkdazu, den Dateinamen von der normalen grepAusgabe und awkden Aufrufen datezum Abrufen des Dateidatums zu trennen. grepEs besteht die -HMöglichkeit, sicherzustellen, dass in der Ausgabe ein Dateiname angezeigt wird, auch wenn in der Befehlszeile nur einer erscheint.

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 der Feldtrenner so eingestellt, :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

    Dies wird ausgeführt, date -r filename +"%F %R"um das Änderungsdatum der Datei in einer zum Sortieren geeigneten Form zu erhalten. Das Datum wird in der Variablen gespeichert d.

  • print d,$0

    Dadurch werden die Daten gefolgt von der Ausgabezeile von gedruckt grep.

verwandte Informationen