Analisar várias seções de dados em arquivos separados

3

Eu tenho um arquivo de log concatenado com vários logs dentro que estou tentando analisar em arquivos de log individuais. Mais tarde, eu os renomeio para a data / hora de cada um. Cada log é separado por "--- LOG REPORT ---".

Até agora eu tenho:

sed -n '/--- LOG REPORT ---/,/--- LOG REPORT ---/p' logname.log > test.out

No entanto, como você pode imaginar, isso apenas mostra a primeira instância do padrão. Eu olhei sobre a página man para sed e não estou convencido de que pode gerar vários arquivos. Talvez eu possa continuar extraindo de um arquivo até que esteja vazio, mas isso parece muito trabalho. Como posso conseguir isso? Talvez eu deva usar o awk em vez disso?

Exemplo de arquivo de entrada filename.log

--- LOG REPORT ---
Mary
Had
A
Little
Lamb
--- LOG REPORT ---
Her
Fleece
Was
White
As
Snow

Saída desejada:

No nome do arquivo_1.log

--- LOG REPORT ---
Mary
Had
A
Little
Lamb

Em nome_do_arquivo_2.log

--- LOG REPORT ---
Her
Fleece
Was
White
As
Snow
    
por Stradigos 20.08.2014 / 15:57

3 respostas

6

Que tal algo como

awk '/--- LOG REPORT ---/ {n++;next} {print > "test"n".out"}' logname.log
    
por 20.08.2014 / 16:10
9

Que tal este comando?

csplit logname.log /---\ LOG\ REPORT\ ---/ {*}

Teste

cat logname.log
--- LOG REPORT ---
Mary
Had
A
Little
Lamb
--- LOG REPORT ---
Her
Fleece
Was
White
As
Snow

Depois de executar o comando acima, a saída que obtenho é

cat xx01
--- LOG REPORT ---
Mary
Had
A
Little
Lamb
cat xx02
--- LOG REPORT ---
Her
Fleece
Was
White
As
Snow
    
por 20.08.2014 / 16:21
2

Ferramenta errada, use perl ou awk, por exemplo,

cat > splitFileByLogReport.pl <<EOF
#!/usr/bin/perl

undef $/;
$_ = <>;
$n = 0;

for $match (split(/(?=--- LOG REPORT ---)/)) {
      open(O, ">$ARGV[$argnum]" . ++$n);
      print O $match;
      close(O);
}

EOF

Em seguida, execute:

perl splitFileByLogReport.pl yourFile.txt
    
por 20.08.2014 / 16:13