Como adicionar várias pesquisas no comando AWK

10

Estou tentando pesquisar os arquivos criados nos meses de junho, julho e agosto. Eu usei esse método

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

mas não está funcionando.

OmiPenguin
fonte
1
Para o registro, a [...]construção corresponde a um único caractere, que pode ser qualquer um dos caracteres entre colchetes. Portanto, sua expressão corresponde JJA ou Jug( Jde [Jun], ude [Jul]e gde [Aug]), mas não as abreviações do mês que você esperava corresponder.
tripleee

Respostas:

12

Você pode corresponder a vários padrões como este:

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

Isso retorna todas as correspondências para junho, julho ou agosto. Você não precisa da printinstrução, pois essa é awka ação padrão.

jasonwryan
fonte
1
awk entende regexps prolongados, por isso para um padrão tão simples quanto que você poderia escrevê-lo como awk '/Jun|Jul|Aug/'ouawk '/Ju[nl]|Aug/'
cas
5

Como regra geral, é uma péssima idéia analisar a saída de ls . Uma maneira melhor de fazer o que você quer é

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

Como alternativa, verifique apenas o último campo para proteger contra o caso improvável em que o nome do arquivo em si é uma data:

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
fonte
Também é um bom exemplo. Eu nunca verifiquei STAT antes. obrigado pela informação excelente
OmiPenguin 29/09
Talvez mude para ... | awk '$NF ~ /2013-0[678]/'para verificar apenas o último campo de saída, no (improvável?) Mesmo que o nome de um arquivo corresponda à regex mesmo quando a data não.
tripleee
3

lsé um comando para exibir informações sobre arquivos em um legível por humanos. Não o use em scripts .

O comando para localizar arquivos em uma árvore de diretórios que corresponde a certos critérios é find. Se você possui o GNU find (por exemplo, Linux ou Cygwin não incorporado) ou o FreeBSD find (por exemplo, FreeBSD ou OSX), pode usar -newermtpara corresponder aos arquivos que foram modificados pela última vez após uma determinada data.

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

Adicione um ano se desejar corresponder arquivos em um ano específico, em vez do ano civil em que o script for executado.

Se sua implementação de localização não tiver -newermt, você terá que se contentar com -newer, que compara a data do arquivo findencontrado com um arquivo fixo. use touchpara criar arquivos temporários com a data que você deseja usar como 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"
Gilles 'SO- parar de ser mau'
fonte