A solução mais confiável que pude encontrar é:
while read -r rec
do age=$(($(date +%s)-$(date -d "${rec:0:16}" +%s)))
[ $age -ge 0 -a $age -le 3600 ] && \
grep -Eiq 'failed|failure' <<< "$rec" && echo "$rec"
done </var/log/mail.log
Isso usa date
para converter os tempos registrados em segundos desde o início de 1970 e, em seguida, os compara com o valor de segundos da hora atual. Isso funcionará em todos os casos, incluindo a hora após a meia-noite, exceto a primeira hora de um ano novo, porque date -d
é padronizado para o ano atual quando nenhum é especificado. Eu suponho que você terá coisas melhores para fazer do que executar este script no início de um novo ano.
A verificação para a idade recorde não-negativa elimina registros futuros, como encontrei no registro de 14 de novembro, quando testei em 3 de novembro. Eu simulei chamadas em tempos diferentes, adicionando um parâmetro -d
à primeira chamada date
, que na resposta obtém a referência de hora atual.