Получить определенные столбцы в Postfix / var / log / maillog

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

Мое предложение состоит в том, что я хочу использовать grep предыдущего дня «to», «status», «said», и это сообщение, например, «said: 550 Invalid Recipient». И дело в том, что один и тот же журнал печатается несколько раз, но мне нужно grep любой из похожих логов из всех.

13 февраля 13:40:35 ganga11 postfix / smtp [12098]: 3371F2BF52: to =, relay = none, delay = 1.2, delay = 0.84 / 0.01 / 0.27 / 0.07, dsn = 5.1.1, status = bounced (хост сказал : 550 5.1.1 Получатель не найден. http://x.co/irbounce (в ответ на RCPT TO команда))

13 февраля 13:40:35 ganga11 postfix / smtp [6923]: 3371F2BF52: to =, relay = none, delay = 1.5, delay = 0.84 / 0 / 0.46 / 0.19, dsn = 5.0.0, status = bounced (хост сказал : 550 Такого пользователя нет ([email protected] (в ответ на команду RCPT TO))

13 февраля 13:40:35 ganga11 postfix / smtp [29489]: 3371F2BF52: to =, relay = none, delay = 1.3, delay = 0.84 / 0.01 / 0.38 / 0.1, dsn = 5.0.0, status = bounced (хост сказал : 550 # 5.1.0 Адрес отклонен. (В ответ на команду RCPT TO))

13 февраля 08:14:45 ganga11 postfix / smtp [6736]: F093B2BCA3: to =, relay = none, delay = 6139, delay = 6139 / 0.02 / 0.15 / 0, dsn = 4.4.1, status = deferred (подключиться к aaaaaa.co.in В подключении отказано)

13 февраля 13:40:36 ganga11 postfix / smtp [6940]: 3371F2BF52: to =, relay = none, delay = 2.3, delay = 0.84 / 0.01 / 0.17 / 1.3, dsn = 5.1.1, status = bounced (хост сказал : 550 5.1.1 Получатель не найден. http://x.co/irbounce (в ответ на RCPT TO команда))

13 февраля 13:40:35 ganga11 postfix / smtp [6923]: 3371F2BF52: to =, relay = none, delay = 1.5, delay = 0.84 / 0 / 0.46 / 0.23, dsn = 5.0.0, status = bounced (хост сказал : 550 Такого пользователя нет ([email protected]) (в ответ на команду RCPT TO))

13 февраля 04:14:24 ganga11 postfix / smtp [6736]: F093B2BCA3: to =, relay = none, delay = 6139, delay = 6139 / 0.02 / 0.15 / 0, dsn = 4.4.1, status = deferred (подключиться к xyzz.com В подключении отказано)

13 февраля 17:14:11 ganga11 postfix / smtp [6736]: F093B2BCA3: to =, relay = none, delay = 6139, delay = 6139 / 0.02 / 0.15 / 0, dsn = 4.4.1, status = deferred (подключиться к bbbbb.com В подключении отказано)


person Narasimman    schedule 15.02.2017    source источник
comment
Привет, кометен, я пробовал использовать sed, awk и grep, но не могу найти нужную команду. Это тот, который казался несколько но извлекает все логи. awk -F, '{print $ 7 $ 12}' /home/samplelog.txt | awk -F \ f = 14 -vt = 25 '{for (i = 14; i ‹= t; i ++) printf (% s% s, $ i, (i == t)? \ n: OFS)}' | sort | uniq   -  person Narasimman    schedule 15.02.2017
comment
Я предлагаю вам использовать grep, чтобы получить нужные строки, и передать его по конвейеру для вырезания, чтобы извлечь столбцы с параметром -f и использовать пробел в качестве разделителя. Где-то вроде 'grep foo | bar | baz | вырезать -d -f 1,2,3 '. serverfault.com - лучшее место, чтобы спросить.   -  person kometen    schedule 15.02.2017


Ответы (1)


Вот кое-что, что может вам помочь.

cat mail.log | grep "postfix/smtp" | grep -P 'status=(?!sent)' | 
sed "s/^.*: \(.\+\):.* to=<\(.\+\)>.* status=\([^ ]\+\) (\(.*\))$/[\1] <\2> \3: \4/" |
sort | uniq

grep "postfix/smtp" фильтрует сообщения, относящиеся к SMTP.

grep -P "status=(?\!sent)" фильтрует сообщения со статусом, отличным от отправлено.

sed ... извлекает идентификатор очереди, адрес получателя, статус и остатки в виде сообщения о состоянии.

sort | uniq фильтрует повторяющиеся записи.

person Joe    schedule 15.02.2017
comment
Привет, Джо, Спасибо за ответ. Но, кстати, я получаю это, когда выполняю команду. Не могли бы вы исправить это, что я пропустил? cat /home/samplelog.txt | grep postfix / smtp | grep -P status = (? \! отправлено) | sed s /^.*: (. \ +):. * to = ‹(. \ +)›. * status = ([^] \ +) ((. *)) $ / [\ 1] ‹\ 2 ›\ 3: \ 4 / | сортировать | uniq grep: нераспознанный символ после (? или (? - - person Narasimman; 15.02.2017
comment
Похоже, вы подавились обратной косой чертой. Помогает ли изменение второго grep на grep -P 'status=(?!sent)'? Или grep -E "status=(bounced|deferred)"? - person Joe; 15.02.2017
comment
Ааааа Чувак !!! Сработало как босс !!! Большое спасибо, Джо :) Ты сегодня мне голову спас - person Narasimman; 15.02.2017