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 '--'
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?
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.