Como pular um registro com o awk

2

Eu tenho um grande número de arquivos em um diretório de log, cujos nomes foram marcados com hora (neste caso, com date +%b[...] ).

Eu quero escrever um one-liner compatível com POSIX que:

ou

  • pula a saída de linhas de ls -ltc que tem 2 campos ou menos (como visto por awk ) e não contém a constante regexp /Jul/

ou

  • pule a saída da primeira linha por ls -ltc e qualquer linha que não corresponda a /Jul/ .

O resultado é o mesmo para o meu propósito, pois somente a primeira linha consiste em dois campos (como visto por awk ).

Eu tentei:

> ll -tc | rm $(awk --posix 'NF > 2 && !/Jul/ {print $NF;}')
> ll -tc | rm $(awk --posix 'NF > 2 !/Jul/ {print $NF;}')

Ambos possuem uma sintaxe ruim porque uma condição na NF aparentemente não coexiste muito bem com uma condição de correspondência de expressões regulares da mesma forma que ls | awk '/foo/ && /bar/' , por exemplo.

Pode sb me dar ponteiros sobre como pular qualquer registro arbitrário e / ou aplicar a condição aritmética na NF e a correspondência de padrões regexp ao mesmo tempo? Eu olhei em volta, mas não consegui encontrar a sintaxe documentada que estou procurando ...

    
por Cbhihe 07.07.2015 / 01:13

2 respostas

2

Ou

awk 'NF<=2 || /Jul/ {next} {print}'

ou

awk 'NR==1 || /Jul/ {next} {print}'

ou, invertendo a lógica para encurtar os comandos,

awk 'NF>2 && !/Jul/ {print}'

ou

awk 'NR!=1 && !/Jul/ {print}'
~$ cat input
first line
Gen second third
Feb second third
Mar second third
Apr second third
May second third
Jun second third
Jul second third
Aug second third
Sep second third
Oct second third
Nov second third
Dec second third
~$ awk 'NF<=2 || /Jul/ {next} {print}' input
Gen second third
Feb second third
Mar second third
Apr second third
May second third
Jun second third
Aug second third
Sep second third
Oct second third
Nov second third
Dec second third
~$ awk 'NR==1 || /Jul/ {next} {print}' input
Gen second third
Feb second third
Mar second third
Apr second third
May second third
Jun second third
Aug second third
Sep second third
Oct second third
Nov second third
Dec second third
    
por kos 07.07.2015 / 01:53
1

@Kos deu uma resposta absolutamente correta à sua pergunta.

Mas acho que você está tentando resolver um problema que não é um problema. Para excluir arquivos que correspondam a um determinado critério, você deve usar find com o parâmetro -delete .

por exemplo:

find . -type f -newermt 2015-07-07  ! -newermt 2015-07-08 -delete
find . -type f -newerat 2015-07-07  ! -newerat 2015-07-08 -delete
    
por A.B. 07.07.2015 / 09:12