Como analisar um arquivo de log para uma string, e quando encontrado, pesquisar para outra string

3

Eu uso o seguinte comando para analisar um arquivo de log para uma string específica. Então eu procuro no log para encontrar os dados que eu realmente quero. O problema como no exemplo abaixo, estou voltando apenas 50 linhas. Não se sabe se o texto que estou procurando será 5 linhas de volta, 200 linhas de volta ou mais. Existe uma maneira de procurar em um arquivo de log por uma string específica, e quando essa string é encontrada, para então procurar para trás através do log para encontrar uma segunda string apesar de não saber até onde a segunda string está localizada. Também pode haver várias ocorrências da primeira string. Então, para cada instância da primeira string, quero poder pesquisar para trás para coletar os dados da segunda string.

grep -B50 "Server returned HTTP response code: 500 for URL:" LCSoap_8.log | \
tac | grep -P -o '(?<=qualified-src-dn=).*(?=src-dn)'
    
por apropos 15.08.2014 / 15:39

2 respostas

2
tac LCSoap_8.log | sed -n '
  /Server returned HTTP response code: 500 for URL:/,/qualified-src-dn=.*src-dn/!d
  s/.*qualified-src-dn=\(.*\)src-dn.*//p'

ou para reutilizar seu grep :

tac LCSoap_8.log | sed '
  /Server returned HTTP response code: 500 for URL:/,/qualified-src-dn=.*src-dn/!d' |
  grep -Po '(?<=qualified-src-dn=).*(?=src-dn)'

sed '/A/,B/!d' deleta todas as linhas, exceto (! ̲) aquelas de para o próximo depois disso.

    
por 15.08.2014 / 16:17
1

Aqui está uma possível solução baseada em PCRE baseada em uma pergunta semelhante Pesquise um padrão e imprima linhas precedentes começando com outro padrão

grep -zPo '.*abc.*(?=(?s)(?(?!abc).)*?xyz)' file

produzirá a última linha contendo abc que ocorre antes de cada instância de xyz

por exemplo. dado um arquivo

1 abc
2 abc
3 abc
4 abc
5 abc
6 bcd
7 cde
8 def
9 xyz
10 xyz

então

$ grep -zPo '.*abc.*(?=(?s)(?(?!abc).)*?xyz)' file
5 abc
    
por 15.08.2014 / 16:45