我正在尝试根据启动它们的客户端从 Postfix 日志文件中提取对话。这是提取匹配消息 ID 的 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
但是,这自然不会按预期工作。我假设我需要做以下事情之一:
- 将第一个 awk 的输出通过管道传输到第二个 awk 或 grep(不确定如何将管道输入用作正则表达式)。
- 将第一个结果集分配给一个数组并将该数组用作搜索集。类似的东西:
awk '/app02/ && !(/timeout/ || /connect/) { sub(":","",$6);msgid[$6]=$6; } END { for(x in msgid) { print x; } }' maillog
我不确定我将如何在 for 循环中进行。awk 中有没有办法“倒带”文件,然后抓取与数组中任何元素匹配的所有行? - 放弃整个交易并使用 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`