我可以使用什么命令来searchsendmail日志,以查找涉及特定收件人的所有邮件详细信息。

CENTOS 5.x | 发送邮件

偶尔我需要通过sendmail传送日志来查找丢失消息发生了什么。 这通常涉及两个(或更多)步骤:

第1步:search/ var / log / maillog获取用户的电子邮件地址。 例如grep -i“[email protected]”/ var / log / maillog

通常返回这样的东西:

Jan 11 07:43:34 server-example sendmail[12732]: p937blksdh3: to=<[email protected]>, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=102537, relay=mta.recipientdomain.com. [12.34.56.78], dsn=5.7.1, stat=Service unavailable 

第二步:我将抓住唯一的消息名称(在这种情况下是p937blksdh3)并search。 例如: grep -i p937blksdh3 / var / log / maillog

我想将第1步和第2步合并为一行,并自动执行与其他ID相同的search。 所以在一个命令中,我想要执行以下操作:

  1. search特定string的sendmail maillog。
  2. 确定电子邮件的消息ID(在上面的例子中,这是p937blksdh3)。 (我猜awk'{print $}'会被使用?)
  3. search相同的日志,但search消息ID,而不是(在上面的例子中,基本上是grep -i p937blksdh3 / var / log / maillog
  4. 输出步骤3的结果。对其他消息标识重复此操作。

你可以做类似的事情。

 for i in `grep -i "[email protected]" /var/log/maillog | awk '{print $5}'`; do grep -i $i /var/log/maillog; done 

这将grep出你正在寻找的用户的行,然后select行中的第五项(由空格iirc分隔)。 然后,对于该列表中的每个消息ID,然后将grep包含消息ID的行。

如果你想从消息ID的末尾删除:你可以在grep -i "[email protected]" /var/log/maillog | awk '{print $5}' | sed 's/\:// grep -i "[email protected]" /var/log/maillog | awk '{print $5}' | sed 's/\:// grep -i "[email protected]" /var/log/maillog | awk '{print $5}' | sed 's/\:// ; 做grep -i $ i / var / log / maillog; DONE

希望有所帮助。

这不是对你的具体问题的直接回答(哈利已经回答了这个问题),而只是一个想要提前计划,如果你经常需要这样的信息的话。 安装MIMEDefang ,然后让filter_recipient例程以最适合您的格式logging所需的所有信息。

这是哈利答案的一个改进。

首先,awk可以像grep那样进行模式匹配,所以你可以跳过第一个grep。 此外,你可能会得到重复的,所以我们可以删除那些sorting-u:

 for i in `awk '/[email protected]/ {print $6}' /var/log/maillog | sort -u `; do grep -i $i /var/log/maillog; done 

该版本通过邮件日志使用两次:

 awk '/[email protected]/ {print $6}' /var/log/maillog | sort -u > /tmp/message-ids.list grep -f /tmp/message-ids.list /var/log/maillog 

在第一个版本中,for循环将grep通过mail.log在日志中find许多消息ID。 在第二个版本中,grep将使用消息ID列表作为filter,并且只处理一次日志文件,这对于大型日志文件来说会更有效。

因为AWK可以做grep的工作,所以没有理由把grep变成awk 。 因为grep可以接受标准input的模式,所以也没有理由使用for循环。

 awk '/[email protected]/ {print $6}' /var/log/maillog | sort -u | grep -i -f - /var/log/maillog 

你可以进一步修改,不需要sort -u (真的, sort是不必要的 – 你可以使用uniq

 awk '/[email protected]/ {addr[$6]} END {for (a in addr) {print addr[a]}}' /var/log/maillog | grep -i -f - /var/log/maillog 

这两个(和其他答案)在日志文件上进行两次或更多遍search。 看看下面的一遍技术是否会更快(还有更快的使用Perl或Python)是很有趣的。

 awk -v addr='[email protected]' '$0 ~ addr { ids[$6] } { for (id in ids) { if ($0 ~ "^" ids[id] "$") { print } } } $NF == "Completed" { delete ids[$1] }' /var/log/maillog 

我没有testing过这个代码。 您可能需要调整字段编号,特别是在find“已完成”日志条目时删除标识的部分。 它可以很容易地做成一个单线。