grep registra linhas de um pedido de id específico

1

Então, eu tenho o seguinte exemplo de log:

2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 1
2015-03-30 10:19:45,250 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 2
2015-03-30 10:19:45,700 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] log message of exception occurred in 
abc.cdef.class.sdk.SampleException: Message exception..
<stacktrace lines goes here>
2015-03-30 10:19:46,100 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 3
2015-03-30 10:19:46,120 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 4
2015-03-30 10:19:46,120 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d800e80-5276-4006-a44d-dd4cea7bcbe1 Info:P13 Code:AB4D] A log message 6

Cada solicitação que vem no servidor como um IDA exclusivo. Eu quero grep todas as linhas de log que têm um determinado IDA e colocar em outro arquivo de log com todas as ocorrências encontradas. Estou usando o grep porque ele também anexa o arquivo e o número da linha (grep –n) onde esses padrões foram encontrados (o serach usa 2 ou 3 arquivos). Mas ainda assim, também quero que as exceções de stacktrace sejam incluídas, o que não está acontecendo porque essas linhas não têm o IDA que estou pesquisando.

Além disso, essa exceção do stacktrace também pode acontecer como parte da última entrada de um IDA específico, como este:

2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 1
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:BECD] A log message 2
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:DFCD] A log message 3
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:BBCD] A log message 4
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCC] log message of exception occurred in 
abc.cdef.class.sdk.SampleException: Message exception..
<stacktrace lines goes here>
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:ed8ede83-1116-4697-a69d-ee6cd575cbe7 Info:P23 Code:ABDD] A log message 5

Alguma sugestão para realizar isso?

P.S.1- Eu tenho procurado por aí, mas eu encontrei muitas pesquisas entre tags, o que no meu caso não é bom o suficiente.

P.S.2-Minha solução atualmente apenas um liner grep, mas estou aberto a outras soluções, como perl, awk, sed, python ou qualquer outro "comando bash caminho a percorrer".

    
por Sousa Gaspar 30.03.2015 / 23:58

3 respostas

3

Solução de Perl:

perl -ne '$id = "6d87de8e-1276-4496-b49d-dd4cd375cbe4";
          print if $match = (/IDA:$id/ .. /IDA:(?!$id)/)
                and $match !~ /E0$/
         ' *.log

Explicação:

  • /regex1/ .. /regex2/ retorna verdadeiro para linhas entre as correspondências.
  • IDA:(?!$id) meand IDA: não seguido por $ id.
  • a última linha em um intervalo é denotada pelo sufixo E0 que a condição verifica, portanto, a última linha (aquela com um IDA diferente) não é impressa.

Para incluir nomes de arquivos e números de linha, use

print "$ARGV:$.:$_"

e adicione o seguinte antes da citação final:

; $. = 0 if eof
    
por 31.03.2015 / 00:16
1

Isto imprime os dados respectivos (cada precedido com o número da linha) para arquivos nomeados como o IDA:

awk 'match($0,/IDA:[^ ]+/) { print NR, $0 > substr($0,RSTART+4,RLENGTH-4) }' logfile
    
por 31.03.2015 / 00:20
1

Sed solution:

sed -n ':2;/IDA:6d87de8/{p;/exception/{:1;n;/IDA:/!{p;b1};b2}}'

A saída suppres do script ( -n option), até atender ao IDA apropriado ( /IDA:6d87de8/ ) que será impresso ( p ). Em seguida, o padrão (linha) será verificado quanto à presença de "exeption" e, em caso afirmativo, começará a operar com a próxima linha ( n ). Se a próxima linha não consistir em IDA: , a linha será impressa e o script irá para a próxima linha (loop iniciado em :1 point). Se o script cosist% cos_de% for iniciado no início (loop em IDA: point)

Se você quiser enumerar linhas - envie as linhas por :2 ou nl e canalize para grep -n ".*" script.

    
por 31.03.2015 / 00:32