Registre o arquivo de log em partes e procure por erros

1

Eu quero colocar um arquivo de log em pedaços e, em seguida, procurar nas peças por erros. Se houver um erro, quero colocar o arquivo de log relevante em outro arquivo.

Exemplo pequeno:

Logfile tem esta aparência:

STARTLOG1
blabla
more_blabla
ENDLOG1
STARTLOG2
ERROR: Errortext
This is an Error
from user XYZ
ENDLOG2
STARTLOG3
blabla
more_blabla
ENDLOG3

Eu quero colocar o arquivo de log em pedaços. Todas as linhas entre STARTLOG e ENDLOG devem ser de 1 peça. Quando um erro aparecer em uma peça, extraia a peça inteira para um arquivo. O arquivo deve ficar assim:

STARTLOG2
ERROR: Errortext
This is an Error
from user XYZ
ENDLOG2

    
por litrax 09.05.2014 / 14:02

1 resposta

2

Tente 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 o que é uma "linha" para awk . Aqui, estou configurando para STARTLOG , para que todo o registro seja tratado como uma única linha. Então, se essa "linha" contiver ERROR , imprimo STARTLOG (o RS , isso é apenas para recriar o mesmo formato).

Você também pode usar a mesma abordagem com o Perl:

perl -lne 'BEGIN{$/="STARTLOG"}{print "$/$_" if /ERROR/}' log 
    
por 09.05.2014 / 15:54

Tags