Como eu pego dois campos no awk a partir de linhas diferentes de uma entrada de log de múltiplas linhas?

1

Estou analisando um arquivo de log de um servidor na tentativa de associar o endereço IP em uma linha de uma entrada de log com o nome de usuário que aparece em outra linha da mesma entrada de log.

Eu tenho entradas de registro como esta abaixo, então há uma grande parte do JSON no caminho. A primeira parte é o ID do usuário na primeira linha, sempre seguido pelo mesmo formato de informações extras de registro e, em seguida, a linha no final com o endereço IP e, em seguida, mais (não incluído).

O awk pode lidar com várias linhas, ou eu deveria estar olhando para colocar o primeiro item em uma variável de memória e emiti-lo quando o segundo campo passa?

2017-08-11 17:12:53.763 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter       : Principal [[email protected]] user ID =='pqr-xyz-coredev'
2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter       : No GoP header [Gop-User] for [email protected]
2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter       : User [pqr-xyz-coredev] details obtained.
 {
    "username": "pqr-xyz-coredev",
    "password": "[PROTECTED]",
    "country": null,
    "department": null,
    "title": null,
    "email": null,
    "enabled": true,
    "accountNonExpired": true,
    "credentialsNonExpired": true,
    "accountNonLocked": true,
    "grantedAuthorities": [
        "GBSUD101 SUPPORT",
        "RG OAG WE1-T1-01234 ADM"
    ]
}
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 URI: /data/load/REF.SWE.RUN.ALL.M.KBD/2017-08-11 GET
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 HEADER 'host': rsadffs199.abc1.com:10040
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 HEADER 'user-agent': PycURL/7.43.0 libcurl/7.52.1 WinSSL zlib/1.2.8
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 HEADER 'accept': */*
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 AUTHORIZATION: hash not displayed
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 PARAM 'endDate': 2099-12-31
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 PARAM 'startDate': 1900-01-01
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 REMOTE ADDRESS: 101.16.75.75
    
por Adam 11.08.2017 / 20:03

2 respostas

1

Tente abaixo de awk :

awk -F"[=':]" '/user ID/{userID=$(NF-1)} /REMOTE ADDRESS/{print userID"," $NF}' 'infile.txt

A saída:

pqr-xyz-coredev, 101.16.75.75
    
por 11.08.2017 / 21:17
0
perl -F"\h+|'" -lane '
   /\huser\h+ID\h/ and $a = $F[-1];
   /\hREMOTE\h+ADDRESS:\h/ and print "$a $F[-1]";
' log.file
  • Perl opções:
    • -F"\h+|'" Isso divide a linha atual em uma execução de espaços brancos horizontais ou no caractere de aspas simples. Isso garante que as informações que estamos procurando estejam sempre no último campo.
    • -l Isso define o ORS para uma nova linha e também o IRS para uma nova linha.
    • -a Isso dividirá os registros de entrada com base no separador de campo fornecido pela opção -F ou o padrão será um espaço em branco. Os campos gravados no registro atual são armazenados na matriz @F .
    • -n Isso configurará um loop de leitura implícito do arquivo de entrada + a autoimpressão de registros para que o stdout seja desativado.
  • quando encontramos uma linha com user ID e delimitada em ambos os lados por espaço em branco horizontal, prosseguimos e lembramos da ID do usuário armazenada no último campo, a saber, $F[-1] .
  • quando encontramos a linha com REMOTE ADDRESS: e delimitada em ambos os lados por horiz. espaço em branco, vamos em frente e imprimir o ID do usuário armazenado anteriormente e o último campo desta linha, que deve conter o endereço IP.

Resultados:

pqr-xyz-coredev 101.16.75.75
    
por 12.08.2017 / 06:14