我有一大堆以.eml格式导出的电子邮件,我正在为关键字提供类似的关键字:
egrep -iR "keyword|list|foo|bar" *
当使用Base64编码的电子邮件附件引起的相对简短的关键字时,这会导致许多误报:
Inbox/Email Subject.eml:rcX2aiCZBfoogjNUShcWC64U7buTJE3rC5CeShpo/Uhz0SeGz290rljsr6woPNt3DQ0iFGzixrdj
Inbox/Email Subject.eml:3qHXNEj5sKXUa3LxfkmEAEWOpW301Pbarq2Jr2IswluaeKqCgeHIEFmFQLeY4HIcTBe3wCf6HzPL
我可以写一条以色符,可以识别并排除这些匹配项,还是可以告诉格雷普(Grep
如果您排除了完全由base64组成的任何匹配,则应仅保留有趣的匹配项。作为一个近似值,不包括完全由基本64组成的线长度长于60个字符的长度可能足以立即进行人类消费。
egrep -iR "keyword|list|foo|bar" . |
egrep -v ':[0-9A-Za-z+/]{60,}$' |
less
如果您需要提高准确性,则可能会预滤消息以排除任何附件。您可能还想检查排除的行是否为4个字符的多个,尽管您不太可能对该特定标准有很多误报。
您可能会发现-w
GREP选项有用(仅匹配完整的单词),尽管它只会减少而不会消除误报,因为大约有1/1024的可能使字符串在一个基本-64编码文件将被非alphanumeric字符包围。
找到给定的字符串时,您可以让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扩展。还有其他方法可以做到这一点,但不那么方便。)
每次您想这样做时要键入很多,因此您会变得更好,使其成为外壳功能(或脚本,但我个人更喜欢函数。)