Acho que a maneira mais fácil é reverter a entrada antes de corresponder:
<logfile tac | sed '/pattern/q' | tac
Usando sed, grep, awk ou ruby, o que é uma maneira simples de encontrar a correspondência última de uma string em um arquivo de log maior, e enviar todas as linhas seguindo (inclusive) para outro arquivo ?
Exemplo:
grep -A222 "_____________" recent/toptrigs.OX.rb.log
é a minha solução mais próxima, já que 222 linhas de contexto do pós-texto devem sempre atingir EOF primeiro, exceto que eu quero que ele comece na última instância de " _ __ _ _ "string. É um arquivo de log crescendo simultaneamente a partir do mesmo processo (então eu manualmente libero STDOUT e STDERR no final do loop de cada item, com este segmento tendo em mente).
Algumas opções aqui.
Você pode usar tac
para inverter a ordem das linhas, depois fazer com que grep inclua a linha depois (agora antes como está invertida) e pará-lo após a primeira partida, então inverta-a novamente para restaurar a ordem, assim:
tac /path/to/file | grep -m 1 -B 1 "mypattern" | tac
Exclua as linhas além da última correspondência e da seguinte linha:
grep -A 1 "mypattern" /path/to/file | tail -n 2
Você deve tentar isso em seus arquivos para ver qual apresenta melhor desempenho no seu caso.
E você pode anexar a saída a um arquivo de log, prefixando os comandos com o redirecionamento de saída padrão >> /path/to/outputfile
.
Tags grep logs sed regular-expression