在浏览.eml文件时忽略base64编码的属性

时间:2012-10-29 15:03:00

标签: regex bash grep base64

我收到了大量以.eml格式导出的电子邮件,我正在为这样的关键字点击:

egrep -iR "keyword|list|foo|bar" *

由于base64编码的电子邮件附件,使用相对较短的关键字会导致许多误报:

Inbox/Email Subject.eml:rcX2aiCZBfoogjNUShcWC64U7buTJE3rC5CeShpo/Uhz0SeGz290rljsr6woPNt3DQ0iFGzixrdj
Inbox/Email Subject.eml:3qHXNEj5sKXUa3LxfkmEAEWOpW301Pbarq2Jr2IswluaeKqCgeHIEFmFQLeY4HIcTBe3wCf6HzPL

我是否可以编写可以识别和排除这些匹配的正则表达式,或者我可以告诉grep一旦到达“Content-Transfer-Encoding:base64”这一行的行就停止读取文件?

2 个答案:

答案 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函数(或脚本,但我个人更喜欢函数。)