Как я могу извлечь все разговоры в журнале Postfix из определенного клиента с помощью awk? - PullRequest
3 голосов
/ 20 июля 2010

Я пытаюсь извлечь разговоры из файла журнала Postfix на основе клиента, который их инициировал. Это сценарий awk, который извлекает соответствующие идентификаторы сообщений:

awk '/client.host.name/ && !(/timeout/||/disconnect/) { sub(":","",$6);print $6}' maillog

Это использует стандартный почтовый журнал Postfix в качестве входных данных (см. Ниже пример данных). Я думаю , что я хотел бы сделать, - это многопроходный поиск файла с использованием результатов первого поиска, но я не уверен, что это правильный подход. Нечто похожее на:

awk '/client.host.name/ && !(/timeout/||/disconnect/) {sub(":","",$6);msgid=$6} $0 ~ msgid {print $0}' maillog

Но, естественно, это не работает, как ожидалось. Я предполагаю, что мне нужно сделать одну из следующих вещей:

  1. Передача выходных данных из первого awk во второй awk или grep (не знаю, как использовать конвейерный ввод в качестве регулярного выражения).
  2. Назначьте первый результирующий набор массиву и используйте массив в качестве поискового набора. Что-то вроде:
    awk '/app02/ && !(/timeout/ || /connect/) { sub(":","",$6);msgid[$6]=$6; } END { for(x in msgid) { print x; } }' maillog
    Я не уверен, как я буду действовать внутри цикла for. Есть ли способ в awk «перемотать» файл и затем захватить все строки, которые соответствуют любому элементу в массиве?
  3. Удалите всю сделку и попробуйте ее с помощью Perl.

Итак, для гуру awk ... есть ли способ выполнить то, что я ищу, используя awk?

Пример данных:

Jul 19 05:07:57 relay postfix/smtpd[5462]: C48F6CE83FA: client=client.dom.lcl[1.2.3.4]
Jul 19 05:07:57 relay postfix/cleanup[54]: C48F6CE83FA: message-id=<20100719100757.C48F6CE83FA@relay.dom.lcl>
Jul 19 05:07:57 relay postfix/qmgr[12345]: C48F6CE83FA: from=<root@dom.lcl>, size=69261, nrcpt=6 (queue active)
Jul 19 05:08:04 relay postfix/smtp[54205]: C48F6CE83FA: to=<recip1@example.org>, relay=in.example.org[12.23.34.5]:25, delay=0.7, delays=0.05/0/0.13/0.51, dsn=2.0.0, status=sent (250 ok: Message 200012345 accepted)
Jul 19 05:14:08 relay postfix/qmgr[12345]: C48F6CE83FA: removed`

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Вы можете использовать массив. Примерно так:

awk '/client.host.name/ && !(/timeout/||/disconnect/) {sub(":","",$6);msgid[$6]=1} {if ($FIELD in msgid) print}' maillog

Где вам нужно будет заменить номер поля, который содержит данные, так как я не знаю его.

Редактировать: Перемещена левая скобка.

Edit2:

Вот версия, специфичная для ваших примеров данных:

awk '/client.dom.lcl/ && !(/timeout/||/disconnect/) {sub(":","",$6); msgid[$6] = 1} {if (gensub(":", "", 1, $6) in msgid) print}' sampledata

Edit2:

Вот упрощенная версия:

awk '{id = gensub(":", "", 1, $6)} /client.dom.lcl/ && !(/timeout/||/disconnect/) {msgid[id] = 1} {if (id in msgid) print}' sampledata
0 голосов
/ 23 апреля 2018

Вы просите awk, но у меня есть скрипт perl, который немного более надежен: https://github.com/brablc/postfix-tools/blob/master/pflogrep

Вы можете использовать как grep:

pflogrep infractor@example.com /var/log/maillog

Или вы можете передать вывод на pflogsumm и получить хорошую статистику:

pflogrep infractor@example.com /var/log/maillog | pflogsumm
...