Como combinar várias linhas começando com uma TAB e a linha antes da primeira em um grupo?

1

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...
    
por Brad Parks 11.02.2015 / 16:20

2 respostas

3

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
    
por 11.02.2015 / 16:37
2

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...
    
por 11.02.2015 / 16:42