Extrai informações específicas dos logs

1

Eu extraí as seguintes informações dos logs brutos abaixo usando este comando:

echo -e "Timestamp\t\tEmailTo:\t\tEmailFrom:\t\t\t\t\tIPAddress:\tErrorCodes:" && sed -n -e 's/.*\([0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9]*\) .*\([0-9][0-9]:[0-9][0-9]:[0-9][0-9]*\).*/ /p' logs

Saída:

Timestamp       EmailTo:        EmailFrom:                  IPAddress:  ErrorCodes:
2017-01-02 12:50:00 
2017-01-02 13:10:25 

Logs brutos:

2017-01-02 12:50:00 1cNxNS-001NKu-9B == [email protected] R=dkim_lookuphost T=dkim_remote_smtp defer (-45) H=mta6.am0.yahoodns.net [98.138.112.38]: SMTP error from remote mail server after MAIL FROM:<[email protected]> SIZE=1772: 421 4.7.0 [TSS04] Messages from 192.168.1.269 temporarily deferred due to user complaints - 4.16.55.1; see https://help.yahoo.com/kb/postmaster/SLN3434.html
2017-01-02 13:10:25 1cNxhD-001VZ3-0f == [email protected] ([email protected]) <[email protected]> R=lookuphost T=remote_smtp defer (-45) H=mta7.am0.yahoodns.net [98.138.112.34]: SMTP error from remote mail server after MAIL FROM:<[email protected]> SIZE=87839: 500 5.9.0 [TSS04] Messages from 192.168.1.269 temporarily deferred due to user complaints - 4.16.55.1; see https://help.yahoo.com/kb/postmaster/SLN3434.html

Mas não consigo extrair as outras informações de que preciso; deveria se parecer com:

Timestamp            EmailTo:              mailFrom:            IPAddress:      ErrorCodes:

2017-01-02 12:50:00  [email protected]  [email protected]       192.168.1.269   421 4.7.0
2017-01-02 13:10:25  [email protected]  [email protected]      192.168.1.269   500 5.9.0

Como posso extrair todas as informações usando sed ?

    
por blaCkninJa 03.01.2017 / 15:32

2 respostas

2

Você pode tentar esta expressão sed :

sed -e 's/^\(.* .* \).* .*== \([^ ]* \).*MAIL FROM:<\([^ ]*\)> [^ ]* \([0-9 .]*\)\[.*Messages from \([^ ]*\).*$/\t\t\t\t/'

Funciona para mim com o seu exemplo.

Explicação

Esta expressão sed contém apenas um comando - s/.../.../ .

Primeira parte de s/// :

'^\(.* .* \)'      -- Timestamp, two first space-separated blocks of text, .
'.* .*== '         -- Uninteresting text after timestamp.
'\([^ ]* \)'       -- Block of test between spaces, first email address, .
'.*MAIL FROM:<'    -- Position before second email.
'\([^ ]*\)>'       -- Second email addr, non-space characters, ended by '>', .
' [^ ]* '          -- SIZE=...:
'\([0-9 .]*\)\['   -- Error codes: digits, spaces and dots ended by '[', .
'.*Messages from ' -- Position before IP.
'\([^ ]*\)'        -- Non-space characters, ended by space, IP. .
'.*$'              -- Text before end of string, not interesting.

Como você pode ver, é apenas uma descrição direta dos registros brutos, não há nada interessante.

A segunda parte de s/// está colocando apenas \N na ordem correta com \t (caractere de tabulação) como separador.

    
por 03.01.2017 / 22:21
0

Eu não tenho muita experiência com o awk, mas pensei em tentar. Eu imagino que isso é bem frágil, já que não sei quantas linhas de log você está tentando obter com isso.

De qualquer forma, isso usa o bloco BEGIN para configurar as variáveis a serem selecionadas e uma string de formatação para impressão antes de exibir o cabeçalho. A hora e o EmailTo são previsíveis, então podem usar os campos numerados ( $1 , $2 e $5 ) antes dos três conjuntos de expressões regulares que são apenas muito difíceis. Qualquer sugestão para melhorar seria apreciada!

awk 'BEGIN {
        from=""; ip=""; error=""; fstr="%-24s%-24s%-40s%-16s%s\n";
        printf(fstr, "Timestamp:", "EmailTo:", "EmailFrom:", "IPAddress:", "ErrorCodes:");
    }
{   for (i=6; i<NF; i++)
    {   
    # From Address
    if ($i ~ /FROM:<[^ ]*>/)  
        from=substr($i, 7, length($i)-7);
    # Errors found in two adjacent fields.
    if ($(i-1) ~ /[[:digit:]]{3}/ && $i ~ /[[:digit:]]\.[[:digit:]]\.[[:digit:]]/)
        error=$(i-1) " " $i;
    # From address after predictable string.
    if ($(i-2) " " $(i-1) == "Messages from" && $i ~ /[[:digit:].]{7,15}/)
        ip=$i;
    }
    printf(fstr, $1" "$2, $5, from, ip, error);
}' logs
    
por 03.01.2017 / 23:32