通过mailq grep'ing

我想过滤由mailq (Postfix)返回的一些邮件ID。 但是,格式不是非常“友善”,因为单个邮件的信息跨越行:

  9F701869D2 1356 Mon Aug 23 12:13:43 some@sender (host some.host[1.2.3.4] said: 450 4.1.1 some error message) some@recipient 9437586CF4 3153 Sat Aug 21 09:36:40 [email protected] (host some.host[1.2.3.4] said: 450 4.1.1 some error message) [email protected] 

例如,获取某些特定错误代码的所有邮件ID的最简单方法是什么? 也许通过删除(单)新行,然后grep ing,然后cut ? 或者通过使用其他更合适的工具?

请解释你的答案。 我的主要兴趣不是针对当前问题的复制粘贴解决scheme(通过错误代码进行过滤),而是理解如何轻松parsing这种多行输出。

关于什么:

grep -C 1说:

-C是上下文,在“said:”之前和之后返回一行。 另外,为了将来的参考,-A用于之后,-B用于之前。

grep -C 1说:| grep ^ [0-9] | cut -f1 -d“”

(用于ID列表)

如果你需要更复杂的东西,那么你将不得不使用awk。

我会使用Perl和Postfix :: Parse :: Mailq模块。
如果你不知道Perl,那么对好的脚本不是很容易,但是可以自由地寻求帮助。
如果您对模块parsing输出的方式感兴趣,请查看源代码