正常に送信されなかった電子メールの電子メールサーバーレポートを保存するメールボックスファイルを解析しています。間違ったメールアドレスを抽出してシステムから削除したいと思います。ログファイルは次のとおりです。
...some content...
The mail system
<[email protected]>: host mx1.hotmail.com[65.54.188.94] said: 550
Requested action not taken: mailbox unavailable (in reply to RCPT TO
command)
...some content...
The mail system
<[email protected]>: host viking.optimumpro.net[79.101.51.82] said: 550
Unknown user (in reply to RCPT TO command)
...some content...
The mail system
<[email protected]>: host mta5.am0.yahoodns.net[74.6.140.64] said: 554
delivery error: dd This user doesn't have a yahoo.com account
([email protected]) [0] - mta1172.mail.sk1.yahoo.com (in reply to end
of DATA command)
...etc.
メールアドレスは「メールシステム」行の後に2行です。このようにgrepを使用すると、「メールシステム」行と次の2行が表示されます。
grep -A 2 "The mail system" mbox_file
しかし、この出力から「メールシステム」行と2番目の空行を削除する方法がわかりません。これを行うためにPHP / Perl / Pythonスクリプトを書くことができると思いますが、grepや他の標準ツールを使ってこれを行うことができるかどうかを知りたいです。 -Bパラメータに負のオフセットを与えてみました。
grep -A 2 -B -2 "The mail system" mbox_file
しかし、grepは次のように文句を言います。
grep: -2: invalid context length argument
grepを使ってこれを行う方法はありますか?
ベストアンサー1
この問題を解決する最も簡単な方法は、最後に別のパイプを注ぐことgrep
です。grep
たとえば、
grep -A 4 "The mail system" temp.txt | grep -v "The mail system" | grep -v '^\d*$'