Jak dodać wiele wyszukiwań w poleceniu AWK

10

Próbuję wyszukać pliki utworzone w czerwcu, lipcu i sierpniu. Użyłem tej metody

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

ale to nie działa.

OmiPenguin
źródło
1
Dla przypomnienia [...]konstrukcja konstruuje pojedynczy znak, którym może być dowolny ze znaków między nawiasami. Więc twoje wyrażenie pasuje JJA lub Jug( Jod [Jun], uod [Jul]i god [Aug]), ale nie oznacza skrótów miesiąca, które chciałeś dopasować.
tripleee

Odpowiedzi:

12

Możesz dopasować do wielu wzorów, takich jak:

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

Zwraca wszystkie dopasowania dla czerwca, lipca lub sierpnia. Nie potrzebujesz printinstrukcji, ponieważ jest awkto akcja domyślna.

jasonwryan
źródło
1
awk rozumie rozszerzone wyrażenia regularne, więc dla wzoru tak prostego, że można go zapisać jako awk '/Jun|Jul|Aug/'lubawk '/Ju[nl]|Aug/'
cas
5

Zasadniczo analizowanie danych wyjściowych ls jest bardzo złym pomysłem . Lepszym sposobem na robienie tego, co chcesz

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

Ewentualnie zaznacz tylko ostatnie pole, aby zabezpieczyć się przed mało prawdopodobnym przypadkiem, gdy sama nazwa pliku jest datą:

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

Od 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
źródło
To także dobry przykład. Nigdy wcześniej nie sprawdzałem STAT. dzięki za wspaniałe informacje
OmiPenguin,
Może zmieni się ... | awk '$NF ~ /2013-0[678]/'tylko sprawdzić pole wyjściowe ostatni, w (prawdopodobnie?) Nawet, że plik jest nazwa pasuje do wyrażenia regularnego, nawet jeśli data nie.
tripleee
3

lsto polecenie wyświetlające informacje o plikach w postaci czytelnej dla człowieka. Nie używaj go w skryptach .

Polecenie znajdowania plików w drzewie katalogów spełniających określone kryteria to find. Jeśli masz funkcję GNU find (tj. Niewbudowany Linux lub Cygwin) lub FreeBSD (np. FreeBSD lub OSX), możesz użyć -newermtdo dopasowania plików, które zostały ostatnio zmodyfikowane po określonej dacie.

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

Dodaj rok, jeśli chcesz dopasować pliki w określonym roku, a nie rok kalendarzowy, w którym skrypt jest uruchamiany.

Jeśli twoja implementacja find nie ma -newermt, musisz się pogodzić z tym -newer, co porównuje datę findznalezienia pliku ze stałym plikiem. służy touchdo tworzenia plików tymczasowych z datą, która ma być używana jako granica.

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- przestań być zły”
źródło