Exibe linhas nos últimos 10 minutos com padrão específico em logs

1

Eu preciso exibir linhas com erro nos últimos 10 minutos de um arquivo de log.

Aug 26 10:50:42 Normal line.
Aug 26 10:51:23 Normal line.
Aug 26 10:55:33 Error line.
Aug 26 10:56:45 Normal line.
Aug 26 10:58:12 Error line.
Aug 26 11:02:31 Normal line.
Aug 26 11:03:32 Normal line.
Aug 26 11:04:11 Normal line.

Suponha a amostra acima do arquivo de log. Eu quero exibir apenas seguindo duas linhas

Aug 26 10:55:33 Error line.
Aug 26 10:58:12 Error line.

Estou usando o AIX.

    
por Hamas Rizwan 25.08.2018 / 22:33

3 respostas

2

Com uma dica de chapéu para Stéphane Chazelas por suas duas respostas aqui:

Eu proponho uma solução de força bruta que faz um loop em todas as entradas de timestamp possíveis nos últimos 10 minutos:

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%(%b %d %H:%M:%S)T\n' "$i seconds ago")
  grep "^${d} Error" logfile
done

É força bruta porque chama grep (e printf, um built-in) 601 vezes. Ele requer um ksh93 que suporte a opção printf %T para imprimir (e formatar) timestamps arbitrários. É mais fácil do que fazer matemática por conta própria, no entanto, devido a casos extremos como:

  • limites do dia
  • limites de mês
  • possíveis alterações no horário de verão
por 25.08.2018 / 22:53
1

Uma possibilidade aqui, rasgando descaradamente a solução do @Jeff Schaller. Invocação única de grep , então talvez um pouco mais rápido.

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%s|%(%b %d %H:%M:%S)T' "${d}" "${i} seconds ago")
done
grep -E "^(${d:1}) Error" logfile
    
por 26.08.2018 / 00:16
0

Obrigado por todas as suas respostas Eu fiz o trabalho necessário com o seguinte comando.

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' logfile

em que d1 e d2 foram inicializados acima. Fiz o trabalho para mim.

Felicidades.

    
por 26.08.2018 / 18:58