Que tal algo como
awk '/--- LOG REPORT ---/ {n++;next} {print > "test"n".out"}' logname.log
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
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
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
Tags text-processing awk sed