3

.eml 形式でエクスポートされた大量のメールがあり、次のようなキーワードを探しています。

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

これにより、次のような base64 でエンコードされた電子メールの添付ファイルが原因で、比較的短いキーワードを使用すると、多くの誤検出が発生します。

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

これらの一致を識別して除外する書き込み可能な正規表現はありますか、または「Content-Transfer-Encoding: base64」という行に到達したら、ファイルの読み取りを停止するように grep に指示できますか?

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

-wbase-64 でエンコードされたファイルの文字列が非英数字で囲まれる可能性は約 1/1024 であるため、grep オプションが役立つ場合があります(完全な単語のみに一致)。文字。

特定の文字列が見つかったときに 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 拡張機能です。これを行う方法は他にもありますが、それほど便利ではありません。)

これを行うたびに入力するのは少し面倒なので、シェル関数 (またはスクリプトですが、個人的には関数の方が好きです) にする方がよいでしょう。

于 2012-10-29T15:40:32.317 に答える