3

我有一大堆 .eml 格式的导出电子邮件,我正在搜索关键字,如下所示:

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

由于 base64 编码的电子邮件附件如下所示,因此在使用相对较短的关键字时会导致许多误报:

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

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

4

2 回答 2

4

如果您排除任何完全由 base64 组成的匹配项,则应该只剩下有趣的匹配项。作为一个近似值,排除任何完全由 base64 组成且长度超过 60 个字符的行可能足以供人类立即使用。

egrep -iR "keyword|list|foo|bar" . |
egrep -v ':[0-9A-Za-z+/]{60,}$' |
less

如果您需要提高准确性,可以预先过滤邮件以排除任何附件。您可能还想检查排除的行是否是 4 个字符的偶数倍,尽管对于该特定标准,您不太可能有很多误报。

于 2012-10-29T15:24:06.587 回答
2

您可能会发现-wgrep 选项很有用(仅匹配完整的单词),尽管它只会减少而不是消除误报,因为 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 函数(或脚本,但我个人更喜欢函数。)

于 2012-10-29T15:40:32.317 回答