Divida o arquivo de log em pedaços e procure por erros

Divida o arquivo de log em pedaços e procure por erros

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 logNonde 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 STARTLOGque 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 

informação relacionada