
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 %T
opçã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.