Come aggiungere più ricerche nel comando AWK


10

Sto cercando di cercare i file creati nei mesi di giugno, luglio e agosto. Ho usato questo metodo

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

ma non funziona.


1
Per la cronaca, il [...]costrutto corrisponde a un singolo carattere, che può essere uno qualsiasi dei caratteri tra parentesi. Quindi la tua espressione corrisponde JJA o Jug( Jda [Jun], uda [Jul]e gda [Aug]) ma non le abbreviazioni del mese che speravi di trovare.
tripla il

Risposte:


12

Puoi abbinare su più modelli in questo modo:

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

Questo restituisce tutte le partite per giugno, luglio o agosto. Non è richiesta la printdichiarazione poiché si tratta awkdell'azione predefinita.


1
awk comprende regexps estesi, quindi per uno schema tanto semplice da poterlo scrivere come awk '/Jun|Jul|Aug/'oawk '/Ju[nl]|Aug/'
cas

5

Come regola generale, è una pessima idea analizzare l'output di ls . Un modo migliore per fare quello che vuoi è

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

In alternativa, controlla solo l'ultimo campo per proteggerti dal caso improbabile in cui il nome del file stesso è una data:

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

Da 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

È anche un buon esempio. Non ho mai controllato STAT prima. grazie per le ottime informazioni
OmiPenguin

Forse passare a ... | awk '$NF ~ /2013-0[678]/'per controllare solo l'ultimo campo di output, nel (improbabile?) Anche che il nome di un file corrisponda alla regex anche quando la data no.
tripla il

3

lsè un comando per visualizzare informazioni sui file in una lettura umana. Non usarlo negli script .

Il comando per trovare i file in un albero di directory che soddisfa determinati criteri è find. Se hai GNU find (ovvero Linux non incorporato o Cygwin) o FreeBSD find (cioè FreeBSD o OSX), puoi usare -newermtper abbinare i file che sono stati modificati l'ultima volta dopo una certa data.

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

Aggiungi un anno se desideri abbinare i file in un anno specifico, anziché l'anno di calendario in cui viene eseguito lo script.

Se l'implementazione di ricerca non ha -newermt, dovrai accontentarti -newer, che confronta la data del file findtrovato con un file fisso. utilizzare touchper creare file temporanei con la data che si desidera utilizzare come limite.

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.