De logs, extraia linha específica após um grep por número de linha

0

Eu tenho um arquivo, debug.log , do qual eu quero extrair todas as linhas que precedem imediatamente um padrão especificado.

Exemplo:

1 blabla
2 blabla
3 HERE THE IMPORTANT THING
4 HERE IT MATCHES MY PATTERN
5 blabla
6 ANOTHER IMPORTANT THING
7 PATTERN
5 blabla

Resultado esperado:

HERE THE IMPORTANT THING
ANOTHER IMPORTANT THING

Com o seguinte comando, posso extrair o número da linha correspondente ao meu padrão

grep -n PATTERN debug.log |cut -f1 -d:

O resultado é

5
8

Agora eu gostaria de subtrair um para cada um desses números e obter a linha correspondente com algo como:

sed -n 4p debug.log
sed -n 7p debug.log

Isso obtém meu resultado esperado.

Posso automatizar isso, então não preciso executar sed manualmente como este?

    
por Med 28.04.2016 / 15:51

2 respostas

2

Isso é mais fácil e usa apenas grep :

grep -B1 PATTERN debug.log | grep -v 'PATTERN\|--'

ou

grep -B1 PATTERN debug.log | grep -v -e 'PATTERN' -e '--'
    
por 28.04.2016 / 16:24
0

Você pode fazer isso apenas com sed:

sed -n -e '/PATTERN/{x;p;x};h'

Em cada linha, se o padrão for correspondido, imprima o espaço de espera. Independente disso, copie a linha atual para o espaço de espera da próxima iteração.

    
por 28.04.2016 / 18:00