Usando || após a substituição do awk ENVIRON

2

Estou usando o awk com uma variável para cortar arquivos de log com base em um timestamp:

LAST_LOG=$last_log awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' $log_file ;

Se a data ainda existir no arquivo de log, ela funcionará, mas se o arquivo de log foi arquivado e substituído por um novo arquivo awk falhará.

Eu quero voltar para cat $log_file se awk falhar:

LAST_LOG=$last_log awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' $log_file ; \
  || cat $log_file

Mas esta sintaxe retorna syntax error near unexpected token || .

A linha acima não é uma função normal que eu posso usar && ou || depois?

    
por Philip Kirkbride 14.12.2017 / 02:56

2 respostas

4

O problema é ; || em

LAST_LOG=$last_log awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' $log_file ; || cat $log_file

O ; encerra a invocação de awk e o próximo comando começa com || , que é um erro de sintaxe.

O que você deseja fazer é verificar se y não é 1 ao final da análise do arquivo de log e, nesse caso, awk retornará um status de saída diferente de zero:

LAST_LOG="$last_log" awk '
  index($0, ENVIRON["LAST_LOG"]) { y = 1; next }
  y                              { print }
  END                            { exit !y }' <"$log_file" || cat <"$log_file"

Sem o exit explícito, você só obterá um status de saída diferente de zero em awk se algum tipo de erro ocorrer.

    
por 15.12.2017 / 11:00
2

Nos comentários, vemos claramente a maneira de corrigir / ajustar o comando do pedido. Seguindo uma abordagem ligeiramente diferente do gnu-Awk:

awk -v L=$last '$0 ~ L {y=1;next};y; END{if(!y) system("cat " FILENAME)}' $log
  • provavelmente a condição $0 ~ L pode ser mais específica (ex $1 <= L ou $1 == L )
por 14.12.2017 / 10:37

Tags