Quero dividir um arquivo de log em partes e, em seguida, procurar erros nessas partes. Se houver um erro, quero colocar a parte do arquivo de log relevante em outro arquivo.
Pequeno exemplo:
O arquivo de log fica assim:
STARTLOG1
blabla
more_blabla
ENDLOG1
STARTLOG2
ERROR: Errortext
Este é um erro
do usuário XYZ
ENDLOG2
STARTLOG3
blabla
more_blabla
ENDLOG3
Quero dividir o arquivo de log em pedaços. Todas as linhas entre STARTLOG e ENDLOG devem ter 1 peça. Quando aparecer um erro em uma peça, extraia a peça inteira para um arquivo. O arquivo deve ficar assim:
STARTLOG2
ERROR: Errortext
Este é um erro
do usuário XYZ
ENDLOG2
Responder1
Experimente isto:
$ awk -v RS="STARTLOG" '/ERROR/{print RS$0; }' log
STARTLOG2
ERROR: Errortext
This is an Error
from user XYZ
ENDLOG2
Para redirecionar para um arquivo chamado logN
onde N é o número de STARTLOG
, use:
gawk -v RS="STARTLOG" '/ERROR/{print RS$0 > "log"$1; }' log
Explicação
RS
é o separador de registros, é o que define para que serve uma "linha" awk
. Aqui, estou configurando para STARTLOG
que todo o registro seja tratado como uma única linha. Aí, se aquela "linha" contiver ERROR
, eu imprimo STARTLOG
(o RS
, isso é só para recriar o mesmo formato).
Você também pode usar a mesma abordagem com Perl:
perl -lne 'BEGIN{$/="STARTLOG"}{print "$/$_" if /ERROR/}' log