我想过滤由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输出的方式感兴趣,请查看源代码