Use apenas o contexto -A
fter, -B
efore ou a opção -C
ontext em grep
, por ex. para ajustar ao seu exemplo:
grep -B2 '^\t' file
Eu tenho alguns arquivos de log de terceiros que estou tentando extrair erros na linha de comando.
Os registros são assim:
time=1
time=2
time=3
at com.test.com....
at com.test.com....
at com.test2.com....
time=4
time=5
time=6
time=7
time=8
time=9
at org.badstuff.com...
at org.badstuff.com...
at org.badstuff.com...
time=10
time=11
As linhas que começam com at
começam com um caractere TAB, então elas podem ser facilmente combinadas.
Como posso extrair esses rastreamentos de pilha desse arquivo, e algumas linhas antes do primeiro rastreamento de pilha toda vez? Estou em um Mac, mas prefiro uma solução genérica que funcione no Mac / Linux, se possível, já que tenho que trabalhar nos dois com bastante frequência.
Então, no meu exemplo acima, eu retiraria o seguinte
time=2
time=3
at com.test.com....
at com.test.com....
at com.test2.com....
time=8
time=9
at org.badstuff.com...
at org.badstuff.com...
at org.badstuff.com...
Use grep -B2 -P '^\t' logfile
para pegar duas linhas antes de cada conjunto de correspondências. Talvez seja necessário mascarar o separador de grupo "-" que é inserido entre as correspondências.
Resultados
$ grep -B2 -P '^\t' /tmp/t
time=2
time=3
at com.test.com....
at com.test.com....
at com.test2.com....
--
time=8
time=9
at org.badstuff.com...
at org.badstuff.com...
at org.badstuff.com...
Tags command-line grep awk