各grep結果の後に行2〜4を表示するには?

各grep結果の後に行2〜4を表示するには?

正常に送信されなかった電子メールの電子メールサーバーレポートを保存するメールボックスファイルを解析しています。間違ったメールアドレスを抽出してシステムから削除したいと思います。ログファイルは次のとおりです。

...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*$'

おすすめ記事