Bash scripting for dummy...

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

leonzi

Bash scripting for dummy...

Непрочитанное сообщение leonzi » 07 дек 2014, 19:23

Всем доброго времени суток.

У меня "небольшая" проблемка... На работе надо проанализировать энное количество почтовых логов, и надо это сделать быстро... Умные люди посоветовали заюзать баш скрипт, но увы я не могу найти как его написать...
Помогите плиз (и плиз сильно не пинать, я тут новенький :) )....

В общем из этого:

Код: Выделить всё

[root@test666 ~]# grep "657167B0024B" /var/log/test/mx.log
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/smtpd[21149]: 657167B0024B: client=unknown[::1]
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/cleanup[21528]: 657167B0024B: warning: header Subject: Krediit from unknown[::1]; from=<test@mail.com> to=<receiver@mail.ru> proto=ESMTP helo=<data.server.eu>
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/cleanup[21528]: 657167B0024B: message-id=<fsdkfjsdf.fgsjkldfhgklfhsg@kfjdshf.fdf.er>
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/qmgr[19278]: 657167B0024B: from=<test@mail.com>, size=571, nrcpt=1 (queue active)
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/qmgr[19278]: 657167B0024B: removed
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/smtp[21452]: 657167B0024B: to=<receiver@e.mail.ru>, orig_to=<receiver@mail.ru>, relay=antivirus.server.eu[127.0.0.1]:25, delay=0.12, delays=0.01/0/0/0.1, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=34593-01, from MTA: 250 2.0.0 Ok: queued as 7780B3402030)
[root@test666 ~]#

Надо получить это:

Код: Выделить всё

13:00:03 (2014-11-30) received by mx.server.eu id:657167B0024B status:sent from:test@mail.com to:receiver@mail.ru
13:00:03 (2014-11-30) passed to antivirus.server.eu id:7780B3402030 status:sent

Может кто-то может навести на верную мысль? ссылку? А то уже задолбался гуглить... :(


Заранее спасибо :)

yko
Интересующийся
Сообщения: 7
Зарегистрирован: 06 дек 2014, 23:40
Контактная информация:

Re: Bash scripting for dummy...

Непрочитанное сообщение yko » 08 дек 2014, 00:00

привет

во-первых -уточните с какой ОС вы работаете.
во-вторых - очень маленький кусочек лога. из которого сложно вытащить суть
(например в обоих ситуациях status у вас send - но из лога я не могу этого видеть, я вижу только один статус по транзакции
лучше подсвечивать места откуда у вас должен браться какой элемент репорта)

но в-принципе должно быть что-то вроде такого
будьте внимательны что например под линуксом пусть к интерпретатору #!/bin/sh
но для freeBSD это #!/usr/local/bin/sh
(+если вы работаете не под линуксом -нужно перепроверить правильность отрабатывания регулярных выражений)

каждый элемент (для которого вы применяли поиск) - это $item
переменная $ITEM_ARRAY - находит все нужные $item и записывает их в нужном формате для цикла for: item1 item2 ... itemN
функция _parser() помогает регулярными выражениями получить нужные куски информации из строчного лога
для каждого $item делается:
- парсер куска лога где встречается $item
- вывод друх строк при помощи переменных реализованых в функции

я продублировал для двух item (657167B0024B , 9999999999) - получил сл.:

Код: Выделить всё

achilles@yko:~$ cat mx.log 
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/smtpd[21149]: 657167B0024B: client=unknown[::1]
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/cleanup[21528]: 657167B0024B: warning: header Subject: Krediit from unknown[::1]; from=<test@mail.com> to=<receiver@mail.ru> proto=ESMTP helo=<data.server.eu>
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/cleanup[21528]: 657167B0024B: message-id=<fsdkfjsdf.fgsjkldfhgklfhsg@kfjdshf.fdf.er>
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/qmgr[19278]: 657167B0024B: from=<test@mail.com>, size=571, nrcpt=1 (queue active)
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/qmgr[19278]: 657167B0024B: removed
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/smtp[21452]: 657167B0024B: to=<receiver@e.mail.ru>, orig_to=<receiver@mail.ru>, relay=antivirus.server.eu[127.0.0.1]:25, delay=0.12, delays=0.01/0/0/0.1, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=34593-01, from MTA: 250 2.0.0 Ok: queued as 7780B3402030)
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/smtpd[21149]: 9999999999: client=unknown[::1]
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/cleanup[21528]: 9999999999: warning: header Subject: Krediit from unknown[::1]; from=<test@mail.com> to=<receiver@mail.ru> proto=ESMTP helo=<data.server.eu>
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/cleanup[21528]: 9999999999: message-id=<fsdkfjsdf.fgsjkldfhgklfhsg@kfjdshf.fdf.er>
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/qmgr[19278]: 9999999999: from=<test@mail.com>, size=571, nrcpt=1 (queue active)
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/qmgr[19278]: 9999999999: removed
13:00:03 (2014-11-30) mx.server.eu [mail.info] postfix/smtp[21452]: 9999999999: to=<receiver@e.mail.ru>, orig_to=<receiver@mail.ru>, relay=antivirus.server.eu[127.0.0.1]:25, delay=0.12, delays=0.01/0/0/0.1, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=34593-01, from MTA: 250 2.0.0 Ok: queued as 7780B3402030)
achilles@yko:~$ ./otvet.sh 
13:00:03 (2014-11-30) received by mx.server.eu  id:657167B0024B status:sent from:test@mail.com to:receiver@mail.ru
13:00:03 (2014-11-30) passed to antivirus.server.eu id:7780B3402030 status:sent
13:00:03 (2014-11-30) received by mx.server.eu  id:9999999999 status:sent from:test@mail.com to:receiver@mail.ru
13:00:03 (2014-11-30) passed to antivirus.server.eu id:7780B3402030 status:sent
achilles@yko:~$ 
вот сам срипт

Код: Выделить всё

#!/bin/sh

ITEM_ARRAY="`cat mx.log | grep relay | sed -E 's/(.*.\]: )(.*)(: to=<.*)/\2/g' | tr '\n' ' '`"

_parser()
{
	RECEIVED_BY="`cat mx.log | grep $item | grep 'from=<' | grep 'to=<' | sed -E 's/(.*.[0-9]*-[0-9]*\))( .*. )(\[mail.*)/\1 received by\2/g'`"
	RECEIVED_STATUS="`cat mx.log | grep $item | grep status | sed -r 's/.*.status=//g' | cut -d " " -f1`"
	RECEIVED_FROM_TO="`cat mx.log | grep $item | grep 'from=<' | grep 'to=<' | sed -E 's/(.*.from=<)(.*)(> to=<)(.*)(> proto=.*)/from:\2 to:\4/g'`"
	PASSED_TO="`cat mx.log | grep $item | grep relay | sed -E 's/([0-9]*-[0-9]*\))(.*.relay=)(.*)(\[[0-9]*.[0-9]*.*.status=)(.*)( \(.*.queued as )(.*)(\))/\1 passed to \3 id:\7 status:\5/g'`"
}

for item in $ITEM_ARRAY;
	do
		_parser
		echo "$RECEIVED_BY id:$item status:$RECEIVED_STATUS $RECEIVED_FROM_TO" ;
	    echo "$PASSED_TO";
	done
	
Вложения
otvet.sh
(846 байт) 258 скачиваний

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей