awk / sed / grep: Imprimindo todas as linhas correspondentes a uma string e todas as linhas com abas após essas linhas

2

Desejo extrair dados relevantes de um encadeamento http que foi iniciado com um UUID específico de um arquivo de log. Exemplo de log:

2018-09-26 06:34:24,815 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 73244) UUID: 111-222-333-444-555
2018-09-26 06:34:25,224 WARN  [com.xxx.xxx.xxx] (http-threads-threads - 74391) Some log message
2018-09-26 06:34:26,782 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 74399) Some log message
2018-09-26 06:34:26,945 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some exception message of the right thread
    at com.xxx.xxx.xxx(someclass.java:114) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:65) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:85) [classes:]
2018-09-26 06:34:26,950 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 74256) Unauthorized: com.xxx.xxx.xxx: Unauthorized
    at com.xxx.xxx.xxx(someclass.java:39) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:49) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:45) [somejar.jar:1.0.0]
2018-09-26 06:34:26,952 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 74395) Some log message
2018-09-26 06:34:27,014 WARN  [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some log message of the right thread
2018-09-26 06:34:27,530 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 74365) Some log message

Eu já posso procurar o UUID e extrair o número do thread usando grep e BASH_REMATCH. Conhecendo o número do thread, posso procurar por "http-threads-threads - 73244". Agora eu quero imprimir todas as linhas com essa string e qualquer eventual exceção (linhas com abas) após essas linhas.

Eu quero uma saída como esta:

2018-09-26 06:34:24,815 INFO  [com.xxx.xxx.xxx] (http-threads-threads - 73244) UUID: 111-222-333-444-555
2018-09-26 06:34:26,945 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some exception message of the right thread
    at com.xxx.xxx.xxx(someclass.java:114) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:65) [somejar.jar:1.0.0]
    at com.xxx.xxx.xxx(someclass.java:85) [classes:]
2018-09-26 06:34:27,014 WARN  [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some log message of the right thread

Eu não posso usar grep -A 3 porque a quantidade de linhas com guias após a correspondência é variável.

Usar awk '/http\-threads\-threads \- 73244/{print $0; getline}/\tat/{print $0}' log.log também imprime outras linhas com guias.

Usar awk '/http\-threads\-threads \- 73244/{a=1;print}/(2[0-9][0-9][0-9]\-[0-1]\-[0-9])/{a=0}' log.log não imprime as linhas com guias.

Uma solução perfeita também se livraria do extra "grep" e "BASH_REMATCH" antes e usaria o UUID, mas eu ficaria totalmente bem com uma solução que toma o número do thread como "input".

Alguém tem uma solução para isso?

    
por ven_sr 27.09.2018 / 16:08

1 resposta

4

O script AWK a seguir corresponde ao UUID e gera as linhas correspondentes nas quais você tem interesse:

#!/usr/bin/awk -f

/UUID: 111-222-333-444-555/ {
    tid = substr($7, 1, length($7) - 1)
}

/^[^\t].*http-threads-threads/ {
    if (substr($7, 1, length($7) -1) == tid) {
        matched = 1
        print
    } else {
        matched = 0
    }
}

/^\t/ && matched

O primeiro bloco corresponde ao UUID e armazena o identificador de encadeamento correspondente.

O segundo bloco corresponde a linhas que não começam com guias, contendo “http-threads-threads”. Se o sétimo campo corresponder ao identificador de thread, o script indicará que estamos em um bloco correspondente e imprimirá a linha atual. caso contrário, o script observa que não estamos em um bloco correspondente.

O terceiro bloco corresponde às linhas que começam nas guias quando estamos em um bloco correspondente e as imprime (a impressão da linha atual é a ação padrão).

    
por 27.09.2018 / 16:24