Cómo agregar búsquedas múltiples en el comando AWK

10

Estoy tratando de buscar los archivos creados en los meses de junio, julio y agosto. Utilicé este método

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

Pero no está funcionando.

OmiPenguin
fuente
1
Para el registro, la [...]construcción coincide con un solo carácter, que puede ser cualquiera de los caracteres entre paréntesis. Por lo tanto, su expresión coincide JJA o Jug( Jdesde [Jun], udesde [Jul]y gdesde [Aug]) pero no las abreviaciones de mes que esperaba hacer coincidir.
tripleee

Respuestas:

12

Puede coincidir en múltiples patrones de esta manera:

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

Esto devuelve todas las coincidencias para junio, julio o agosto. No necesita la printdeclaración, ya que es awkla acción predeterminada.

jasonwryan
fuente
1
awk entiende las expresiones regulares extendidas, por lo que para un modelo tan simple como que se puede escribir como awk '/Jun|Jul|Aug/'oawk '/Ju[nl]|Aug/'
cas
5

Como regla general, es una muy mala idea analizar la salida de ls . Una mejor manera de hacer lo que quieres es

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

Alternativamente, verifique solo el último campo para protegerse contra el caso improbable de que el nombre del archivo sea una fecha:

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

De 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
fuente
También es un buen ejemplo. Nunca revisé STAT antes. gracias por la gran información
OmiPenguin
Tal vez cambie a ... | awk '$NF ~ /2013-0[678]/'para verificar solo el último campo de salida, en el (¿improbable?) Incluso que el nombre de un archivo coincida con la expresión regular, incluso cuando la fecha no lo hace.
tripleee
3

lses un comando para mostrar información sobre archivos en forma legible por humanos. No lo use en scripts .

El comando para buscar archivos en un árbol de directorios que coincida con ciertos criterios es find. Si tiene GNU find (es decir, Linux o Cygwin no incrustado) o FreeBSD find (es decir, FreeBSD u OSX), puede usar -newermtpara hacer coincidir los archivos que se modificaron por última vez después de una fecha determinada.

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

Agregue un año si desea hacer coincidir los archivos en un año específico, en lugar del año calendario cuando se ejecuta el script.

Si su implementación de búsqueda no tiene -newermt, tendrá que arreglárselas con -newer, que compara la fecha del archivo que se findencontró con un archivo fijo. use touchpara crear archivos temporales con la fecha que desea usar como límite.

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- deja de ser malvado'
fuente