我收到了大量以.eml格式导出的电子邮件,我正在为这样的关键字点击:
egrep -iR "keyword|list|foo|bar" *
由于base64编码的电子邮件附件,使用相对较短的关键字会导致许多误报:
Inbox/Email Subject.eml:rcX2aiCZBfoogjNUShcWC64U7buTJE3rC5CeShpo/Uhz0SeGz290rljsr6woPNt3DQ0iFGzixrdj
Inbox/Email Subject.eml:3qHXNEj5sKXUa3LxfkmEAEWOpW301Pbarq2Jr2IswluaeKqCgeHIEFmFQLeY4HIcTBe3wCf6HzPL
我是否可以编写可以识别和排除这些匹配的正则表达式,或者我可以告诉grep一旦到达“Content-Transfer-Encoding:base64”这一行的行就停止读取文件?
答案 0 :(得分:4)
如果您排除任何完全由base64组成的匹配项,您应该只留下有趣的匹配项。作为一个近似值,排除任何完全由base64组成的长度大于60个字符的行可能足以供人们立即使用。
egrep -iR "keyword|list|foo|bar" . |
egrep -v ':[0-9A-Za-z+/]{60,}$' |
less
如果您需要提高准确度,可以预先过滤邮件以排除任何附件。您可能还想检查排除的行是4个字符长的偶数倍,尽管您不太可能对该特定标准有很多误报。
答案 1 :(得分:2)
你可能会发现-w
grep选项很有用(只匹配完整的单词),虽然它只会减少而不能消除误报,因为base-64编码的字符串大概有1/1024的可能性文件将被非字母数字字符包围。
你可以让grep在找到一个给定的字符串时停止匹配,例如Content-Transfer-Encoding: base64
,但只需要总是在第一次匹配时停止,同时匹配该字符串并将最大匹配数设置为1但是,您必须过滤匹配项:
grep -EiR -e "Content-Transfer-Encoding: base64" -e "foo|bar" -x 1 * |
grep -v -i "Content-Transfer-Encoding: base64"
你可以通过gawk更轻松,更精确地做到这一点:
awk 'BEGIN {IGNORECASE=1}
/Content-Transfer-Encoding: base64/ {nextfile}
/foo|bar/ {print FILENAME":"$0}' *
(注意:nextfile
是一个gawk扩展。还有其他方法可以做到这一点,但不方便。)
每次想要这样做时都要输入一些内容,所以你最好把它变成shell函数(或脚本,但我个人更喜欢函数。)