我想过滤mailq
(Postfix) 返回的一些邮件 ID。但是,格式不太“grep 友好”,因为单身的邮件跨度多种的行:
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
ing?或者通过使用其他更合适的工具?
请解释您的答案。我的主要兴趣不是针对当前问题(按错误代码过滤)的复制粘贴解决方案,而是了解如何轻松解析此类多行输出。
答案1
关于什么:
grep -C 1 说:
-C 是上下文,返回“said:”前后各一行。另外,供以后参考,-A 表示之后,-B 表示之前。
grep -C 1 说:| grep ^[0-9] | cut -f1 -d " "
(获取 ID 列表)
如果您需要更复杂的东西,那么您必须使用 awk。
答案2
我会使用 Perl 和Postfix::Parse::Mailq模块。
如果你不懂 Perl,那么编写好的脚本并不容易,但可以随时寻求帮助。
如果你对模块如何解析输出感兴趣,请检查来源
答案3
答案4
只要你能找到方法来隔离发送者或接收者的地址,就可以使用 awk 来解析 mailq:
mailq | grep @ | awk {'print $7'}