Gibt es eine Möglichkeit,ack
Die gefundenen Ergebnisse nach Änderungsdatum sortieren? (idealerweise das Datum neben dem Ergebnis anzeigen?). Es sieht nicht so aus, als ob es ack
eine Datumsoption gäbe, aber nur für den Fall.
Wenn dies mit nicht möglich ist ack
, wie wäre es mit grep
oder mithilfe einer Kombination von Tools?
Antwort1
Weder ack
noch grep
haben 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 xargs
die Ausgabe von entweder ack
oder grep
in einem anderen Befehl ausführen, der die Änderungsdaten bereitstellt. Für die Änderungsdaten können Sie stat
dazu 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 awk
dazu, den Dateinamen von der normalen grep
Ausgabe und awk
den Aufrufen date
zum Abrufen des Dateidatums zu trennen. grep
Es besteht die -H
Mö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 awk
Befehle
-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 gespeichertd
.print d,$0
Dadurch werden die Daten gefolgt von der Ausgabezeile von gedruckt
grep
.