如何使用awk从特定客户端提取Postfix日志中的所有会话?

时间:2010-07-20 14:32:40

标签: regex awk postfix-mta

我正在尝试根据启动它们的客户端从Postfix日志文件中提取对话。这是提取匹配消息ID的awk脚本:

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

这是使用标准的Postfix maillog作为输入(参见下面的示例数据)。我想我想做的是使用第一次搜索的结果对文件进行多次搜索,但我不确定这是否是正确的方法。类似于:

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进行尝试。
  4. 所以,对于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 个答案:

答案 0 :(得分:2)

您可以使用数组。大致像这样:

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

答案 1 :(得分:0)

您要求awk,但我有一个perl脚本更加强大:https://github.com/brablc/postfix-tools/blob/master/pflogrep

您可以使用is as grep:

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

或者您可以将输出提供给pflogsumm并获得更好的统计信息:

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