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

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

Preciso exibir linhas com Erro ocorrido 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. Quero exibir apenas duas linhas seguintes

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

Estou usando AIX.

Responder1

Com uma gorjeta para Stéphane Chazelas pelas duas respostas aqui:

Proponho uma solução de força bruta que percorre todas as entradas possíveis de carimbo de data/hora 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 recurso interno) 601 vezes. Requer um ksh93 que suporte a %Topção printf para imprimir (e formatar) carimbos de data e hora arbitrários. É mais fácil do que fazer contas de datas sozinho, por causa de casos extremos como:

  • limites do dia
  • limites do mês
  • possíveis mudanças no horário de verão

Responder2

Uma possibilidade aqui, roubar descaradamente a solução de @Jeff Schaller. Invocação única de grep, 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

Responder3

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

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

onde d1 e d2 foram inicializados acima. Fez o trabalho para mim.

Saúde.

Responder4

Se precisar obter as linhas dos últimos 10 minutos a cada 10 minutos, você pode usar ocortar o logferramenta que permite imprimir uma parte final invisível de um arquivo de log. Primeiro você salva a posição do arquivo por comando

$ cutthelog logfile > /dev/null

em seguida, processe o log por cron job, por exemplo

*/10 * * * * root cutthelog logfile | grep 'Error line' | ..."

Como benefício extra, você se livra da leitura de todo o registro em cada cheque.

informação relacionada