Извлечение из журналов

Извлечение из журналов

Фактические журналы:

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

Что я хочу получить:

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

Я извлек первые три поля из следующей команды:

 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

Спасибо всем, но я сделал это через:

 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"

решение1

Вы были на правильном пути, используя awk. Вам следует написать скрипт, который читает ваши логи и выводит данные с полями, разделенными табуляцией¹. Затем используйте команду column, чтобы перевыравнивать столбцы:

извлечение.awk²:

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

Затем запустите его с помощью этой команды:

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

Где это '^I'представляет собой фактическую табуляцию в кавычках.

Единственной сложной частью было иметь дело с сообщениями об ошибках в журналах, которые могли быть переменным количеством слов. Я решил это, подсчитав столбцы справа для полей IP и кода ошибки.

Вот как выглядел результат:

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

Возможно, я ошибся в своих предположениях относительно входных столбцов, поскольку вы не указали, какой из них какой, и если вы хотите очистить адреса электронной почты в третьем столбце, то, возможно, вы слишком глубоко увязли в awk, и пришло время подумать об использовании Python или Perl.


¹или с разделителем вывода по вашему выбору, пока он не будет ни в каких данных. Затем просто используйте это как аргумент -sдля column.

²Как отмечает @Kusalananda, нет причин писать скрипт awk в одну строку. Вот его версия:

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

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

Что касается меня, то я люблю однострочные ответы.

Связанный контент