web-dev-qa-db-ja.com

grepを使用してすべてのメールを検索する

「grep」Linuxプログラムの正規表現を適切に構築して、/ etcディレクトリなどのすべての電子メールを検索するにはどうすればよいですか?現在、私のスクリプトは次のとおりです。

grep -srhw "[[:alnum:]]*@[[:alnum:]]*" /etc

それは正常に機能しています-いくつかの電子メールを参照してください、しかし私がそれを変更するとき、「@」記号の前後の1つ以上の文字をキャッチするために...

grep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc

..まったく動作しなくなります

また、「[email protected]」という形式の電子メールはキャッチしません。

助けて !

17
AntonAL

これは別の例です

grep -Eiorh '([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,6})' "$@" * | sort | uniq > emails.txt

このバリアントは、3レベルドメインで機能します。

22
mosg

grepでは、+を含むほとんどの正規表現の特殊文字をエスケープする必要があります。次の2つのうちの1つを実行する必要があります。

grep -srhw "[[:alnum:]]\+@[[:alnum:]]\+" /etc

egrep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc
6
Cascabel

正規表現を変更して、句読点(.-_など)を含めるようにしました。

egrep -ho "[[:graph:]]+@[[:graph:]]+"

これはまだかなりきれいで一致しています...まあ、もちろん、@が含まれているほとんどのもの。また、第3レベルのドメインで、「%」または「+」が含まれるアドレスもあります。使用される文字クラスに関する優れたドキュメントについては、 http://www.delorie.com/gnu/docs/grep/grep_8.html を参照してください。

私の例では、アドレスは空白で囲まれているため、照合が非常に簡単です。たとえば、メールサーバーログをgrepする場合は、<>を追加して、アドレスのみに一致させることができます。

egrep -ho "<[[:graph:]]+@[[:graph:]]+>"

@ thomas、@ glowcoder、@ oedoはすべて正しいです。電子メールアドレスがどのように見えるかを定義するRFCは、非常に楽しい読み物です。 (私はGNU grep 2.9、Ubuntuに含まれています)を使用しています)。

以下のzpeaのバージョンもチェックしてください。これにより、トリガーの満足度が低くなります。

5
Florian Sesser

メールアドレスをフィルタリングするためにこれを使用しました「アットマーク」記号で識別され、空白で区切られていますテキスト内:

egrep -o "[^[:space:]]+@[^[:space:]]+" | tr -d "<>"

もちろん、代わりにgrep -Eを使用できますegrep(拡張grep )。 trコマンドは、一般的な電子メール区切り文字を削除するために使用されることに注意してください。

3
caligari

grep -E -o -r "[A-Za-z0-9][A-Za-z0-9._%+-]+@[A-Za-z0-9][A-Za-z0-9.-]+\.[A-Za-z]{2,6}" /etc

これは元々私のものではない答えから適応されていますが、私はそれが非常に役立つと思いました。ここからです:

http://www.shellhacks.com/en/RegEx-Find-Email-Addresses-in-a-File-using-Grep

彼らは提案します:

grep -E -o -r "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" /etc

ただし、「+ person .. @ example.com」や「person @ .. com」などの特定の誤検知があり、空白の制約では「mailto:[email protected]」などが欠落しています(技術的にはメールですが、メールが含まれています);少し調整しました。

(grepのオプションを使用して、やりたいことを実行してください。よくわかりません)

2
Tyler

これのわずかなバリエーションが、Twitterのツイートなどから言及を取得するのに最適であることを述べたかっただけです。

grep -Eiorh '(@[[:alnum:]_.-]+)' "$@" * | sort | uniq -c

0
Phy6

この再帰的なものは私にとって素晴らしい働きをします:

grep -rIhEo "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" /etc/*
0
Olivier