Extraindo de registros

Extraindo de registros

Os registros reais são:

2016-06-19 22:08:09 [213917] 1bEgCe-000tZR-E9 ** [email protected] ([email protected]) <[email protected]> F=<[email protected]> P=<[email protected]> R=lookuphost T=remote_smtp H=mailin-01.mx.aol.com [64.12.88.131]:25 I=[36.23.21.11]:60147: SMTP error from remote mail server after initial connection: 554- (RTR:BL)  https://postmaster.aol.com/error-codes#554rtrbl\n554  Connecting IP: 36.23.21.11
2016-06-20 01:03:22 [516458] 1bEiwD-001zt7-IY ** [email protected] ([email protected]) <[email protected]> F=<[email protected]> P=<[email protected]> R=lookuphost T=remote_smtp H=mailin-02.mx.aol.com [64.12.88.163]:25 I=[36.23.21.14]:47630: SMTP error from remote mail server after initial connection: 554- (RTR:BL)  https://postmaster.aol.com/error-codes#554rtrbl\n554  Connecting IP: 36.23.21.14
2016-06-20 09:29:46 [256975] 1bEqpT-0014jI-HV ** [email protected] F=<[email protected]> P=<[email protected]> R=dkim_lookuphost T=dkim_remote_smtp H=mailin-04.mx.aol.com [64.12.88.132]:25 I=[36.23.21.11]:43705: SMTP error from remote mail server after initial connection: 421 DYN:T2  https://postmaster.aol.com/error-codes#554rtrbl\n554  Connecting IP: 36.23.21.11
2016-06-20 11:41:34 [413114] 1bEstm-001jSC-Ic ** [email protected] F=<[email protected]> P=<[email protected]> R=dkim_lookuphost T=dkim_remote_smtp H=mailin-02.mx.aol.com [64.12.91.195]:25 I=[36.23.21.14]:48714: SMTP error from remote mail server after initial connection: 421 DYN:T1  https://postmaster.aol.com/error-codes#554rtrbl\n554  Connecting IP: 36.23.21.14

O que eu quero obter:

Timestamp       EmailTo:        EmailFrom:               IPAddress:      ErrorCodes:
2016-06-19      [email protected]  [email protected]     36.23.21.11     554- (RTR:BL)
2016-06-20      [email protected]  [email protected]     36.23.21.14     554- (RTR:BL)
2016-06-20      [email protected]    [email protected]        36.23.21.11     421 DYN:T2
2016-06-20      [email protected] [email protected]  36.23.21.14     421 DYN:T1

Extraí os três primeiros campos do seguinte comando:

 echo -e "Timestamp\t\tEmailTo:\t\tEmailFrom:\t\t\t\t\t\t\t\tIPAddress:\tErrorCodes:" && awk 'NF>6 { d=6 ; while ( ! ($d ~ /^F=/ ) ) d++ ; printf "%s\t%s\t%s\n",$1,$6,substr($d,4,length($d)-4) ;} ' logs | column -t

Obrigado a todos, mas eu fiz isso através de:

 echo -e "Timestamp:\tEmailTo:\tEmailFrom:\t\tIPAddress:\tErrorCodes:" && awk 'NF>6 { d=6 ; while ( ! ($d ~ /^F=/ ) ) d++ ; print "%s\t%s\t%s\t%s\t%s\t%s\n",$1,$6,substr($d,4,length($d)-4),$NF,$(NF-5)$(NF-4) ; }' oops | column -t| grep -v "%s"

Responder1

Você estava no caminho certo para usar o awk. Você deve escrever um script que leia seus logs e produza com os campos separados por tabulações¹. Em seguida, use o comando column para realinhar as colunas:

extrair.awk²:

BEGIN {OFS="\t"; print "Timestamp\tEmailTo:\tEmailFrom:\tIPAddress:\tErrorCodes:"}
{print $1, $6, $7, $NF, $(NF-5)}

Em seguida, execute-o com este comando:

awk -f extract.awk logs | column -t -s '^I'

Onde isso '^I'representa uma guia real entre aspas.

A única parte complicada era lidar com as mensagens de erro nos logs, que podiam ter um número variável de palavras. Resolvi isso contando as colunas da direita para os campos IP e código de erro.

Esta é a aparência da saída:

Timestamp   EmailTo:         EmailFrom:                      IPAddress:   ErrorCodes:
2016-06-19  [email protected]   ([email protected])     36.23.21.11  554-
2016-06-20  [email protected]   ([email protected])  36.23.21.14  554-
2016-06-20  [email protected]     F=<[email protected]>           36.23.21.11  421
2016-06-20  [email protected]  F=<[email protected]>     36.23.21.14  421

Posso ter adivinhado errado sobre as colunas de entrada, já que você não especificou qual era qual, e se quiser limpar os endereços de e-mail na terceira coluna, você pode estar muito envolvido com o awk, e é hora de pensar em usar Python ou Perl.


¹ou com o separador de saída de sua escolha, desde que não esteja em nenhum dos dados. Então basta usar isso como -sargumento para column.

²Como aponta @Kusalananda, não há razão para um script awk ser escrito como uma linha. Aqui está a versão dele:

BEGIN   {
    OFS="\t";
    print "Timestamp\tEmailTo:\tEmailFrom:\tIPAddress:\tErrorCodes:";
}

{
    print $1, $6, $7, $NF, $(NF-5);
}

Quanto a mim, gosto de uma frase única.

informação relacionada