So fügen Sie im AWK-Befehl mehrere Suchvorgänge hinzu

10

Ich versuche nach den Dateien zu suchen Erstellt in den Monaten Juni, Juli und August. Ich habe diese Methode verwendet

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

aber es funktioniert nicht.

OmiPenguin
quelle
1
Für den Datensatz [...]stimmt das Konstrukt mit einem einzelnen Zeichen überein, bei dem es sich um eines der Zeichen in Klammern handeln kann. Ihr Ausdruck stimmt also mit JJA oder Jug( Jvon [Jun], uvon [Jul]und gvon [Aug]) überein, aber nicht mit den Monatsabkürzungen, auf die Sie gehofft haben.
Tripleee

Antworten:

12

Sie können mehrere Muster wie folgt abgleichen:

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

Dies gibt alle Übereinstimmungen für Juni, Juli oder August zurück. Sie benötigen die printAnweisung nicht, da dies die awkStandardaktion ist.

Jasonwryan
quelle
1
awk versteht erweiterte reguläre Ausdrücke, so dass Sie für ein Muster, das so einfach ist, dass Sie es als awk '/Jun|Jul|Aug/'or schreiben könnenawk '/Ju[nl]|Aug/'
cas
5

In der Regel ist es eine sehr schlechte Idee, die Ausgabe von ls zu analysieren . Ein besserer Weg, um zu tun, was Sie wollen, ist

stat -c "%n %y" * | grep 2013-0[678]

Alternativ können Sie nur das letzte Feld aktivieren, um sich vor dem unwahrscheinlichen Fall zu schützen, dass der Dateiname selbst ein Datum ist:

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

Von man stat:

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name
terdon
quelle
Es ist auch ein gutes Beispiel. Ich habe STAT noch nie überprüft. danke für tolle Infos
OmiPenguin
Wechseln Sie möglicherweise zu ..., | awk '$NF ~ /2013-0[678]/'um nur das letzte Ausgabefeld zu überprüfen, in dem (unwahrscheinlich?) Sogar, dass der Name einer Datei mit dem regulären Ausdruck übereinstimmt, auch wenn das Datum nicht übereinstimmt.
Tripleee
3

lsist ein Befehl zum Anzeigen von Informationen zu Dateien, die von Menschen gelesen werden können. Verwenden Sie es nicht in Skripten .

Der Befehl zum Suchen von Dateien in einem Verzeichnisbaum, der bestimmten Kriterien entspricht, lautet find. Wenn Sie GNU find (dh nicht eingebettetes Linux oder Cygwin) oder FreeBSD find (dh FreeBSD oder OSX) haben, können Sie -newermtDateien abgleichen, die zuletzt nach einem bestimmten Datum geändert wurden.

find . -newermt '1 June' ! -newermt '1 September' -print

Fügen Sie ein Jahr hinzu, wenn Sie Dateien in einem bestimmten Jahr abgleichen möchten, und nicht das Kalenderjahr, in dem das Skript ausgeführt wird.

Wenn Ihre Find-Implementierung nicht vorhanden ist -newermt, müssen Sie damit auskommen -newer, wodurch das Datum der gefundenen Datei findmit einer festen Datei verglichen wird . Verwenden Sie touchdiese Option, um temporäre Dateien mit dem Datum zu erstellen, das Sie als Begrenzung verwenden möchten.

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
Gilles 'SO - hör auf böse zu sein'
quelle