Назад | Перейти на главную страницу

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

Я хочу получить следующую информацию из необработанных журналов:

2016-05-23 11:01:40 [1005583] 1b4ivg-004DZf-GX ** mustafa@hotmail.com F=<abbas@DomainName> P=<abbas@DomainName> R=dkim_lookuphost T=dkim_remote_smtp H=mx2.hotmail.com [65.54.188.72]:25 I=[IP Address]:56910 X=TLSv1.2:ECDHE-RSA-AES256-SHA384:256 CV=yes DN="/CN=*.hotmail.com": SMTP error from remote mail server after MAIL FROM:<abbas@DomainName> SIZE=275286: 421 RP-001 (BAY004-MC1F14) Unfortunately, messages from 16.23.21.111 weren't sent. Please contact your Internet service provider since part of their network is on our block list. You can also refer your provider to http://mail.live.com/mail/troubleshooting.aspx#errors.
2016-05-23 11:12:53 [1015989] 1b4j6h-004GIq-Ob ** tariq@hotmail.com F=<corporate-kbl@DomainName> P=<corporate-kbl@DomainName> R=lookuphost T=remote_smtp H=mx3.hotmail.com [65.55.37.120]:25 I=[IP Address]:51605 X=TLSv1.2:ECDHE-RSA-AES256-SHA384:256 CV=yes DN="/CN=*.hotmail.com": SMTP error from remote mail server after MAIL FROM:<corporate-kbl@DomainName> SIZE=17484: 550 SC-001 (COL004-MC4F44) Unfortunately, messages from 16.23.21.111 weren't sent. Please contact your Internet service provider since part of their network is on our block list. You can also refer your provider to http://mail.live.com/mail/troubleshooting.aspx#errors.
2016-05-23 11:13:19 [1020551] 1b4j76-004HUH-Nr ** yousuf@hotmail.com (muhammad.yousuf@DomainName) <muhammad.yousuf@DomainName> F=<saeed.ahmed@DomainName> P=<saeed.ahmed@DomainName> R=dkim_lookuphost T=dkim_remote_smtp H=mx3.hotmail.com [134.170.2.199]:25 I=[IP Address]:55971 X=TLSv1.2:ECDHE-RSA-AES256-SHA384:256 CV=yes DN="/CN=*.hotmail.com": SMTP error from remote mail server after MAIL FROM:<saeed.ahmed@DomainName> SIZE=24006: 550 DY-001 (BLU004-MC1F21) Unfortunately, messages from 16.23.21.111 weren't sent. Please contact your Internet service provider since part of their network is on our block list. You can also refer your provider to http://mail.live.com/mail/troubleshooting.aspx#errors.

Поскольку у меня есть следующий набор кодов ошибок, они могут возникнуть, если они возникают, в поле ошибки отображается ошибка:

421 RP-001
421 RP-002
421 RP-003
550 SC-001
550 SC-002
550 SC-003
550 SC-004
550 DY-001
550 DY-002
550 DY-001
550 OU-001
550 OU-002

Поскольку я получаю первые три поля, выводимые следующей командой:

  echo "Timestamp            emailto:                  emailfrom:" && 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

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

  Timestamp:                    Email To:               Email From:            Messages From:       Error Codes:
 2016-05-23                mustafa@hotmail.com       abbas@DomainName          16.23.21.111         421 RP-001
 2016-05-23                tariq@hotmail.com       corporate-kbl@DomainName    16.23.21.111         550 SC-001
 2016-05-23                yousuf@hotmail.com      saeed.ahmed@DomainName      16.23.21.111         550 DY-001  

Вы бы не использовали grep, вы могли бы использовать awk, но я предпочитаю красивое регулярное выражение с sed.

# <logs sed -nE 's,^([-0-9]{10})[^@]* ([^@]*@[^[:space:]]*)[^=]*F=<([^@]*@[^[:space:]]*)>.*SIZE=[^[:space:]]* (... ..-...) .*([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+).*,\1 \2 \3 \5 \4,p'

Выглядит пугающе, но биты в круглых скобках фиксируются как группы (\ 1 \ 2 и т. Д.), Так что первая - это дата (10 цифр или -), затем происходит переход к следующему знаку @ ([^ @] означает что-либо, не совпадающее @), группирует адрес электронной почты, переходит к следующему =, обратно к F, группирует адрес F, затем переходит к SIZE, затем берет код ошибки (три любых, пробел, два любых, дефис, три из что угодно, затем переходит к IP-адресу (упражнение для читателя) .Команда 'p' заставляет sed печатать любую заменяемую строку.

Он не выполняет много проверок, например, 9.9.99.999 является допустимым IP-адресом для него, но это выходит за рамки задачи.

Это помогает?

Вы можете вставить табуляторы вместо пробелов в последней части для выравнивания.