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

答え2

ロックされていない場合はgrepお試しくださいsed...

sed -n '/The mail system/{n;n;p}' 

「mail system」を含む行を見つけたら、次の行を2回通過し、前の行n;n;をそれぞれ削除します。
これにより、パターンスペースにグループの3行目が残り、psed printコマンドで印刷されます。先行-nオプションは他のすべての印刷をブロックします。

次の2行を印刷するには、これは単なる例です。次のステップと印刷 n;pもう2回。

sed -n '/The mail system/{n; n;p; n;p; n;p}'   

必要な行の次の行の読み取りは累積され、単一のブロックとして印刷できますpN次の行を読み、パターンスペースに追加します。

最終削除バージョンは次のとおりです。

sed -n '/The mail system/{n;n;N;N;p}'   

ひとりが欲しいならグループ区切り記号、grep出力と同様にsedを使用できます入れるコマンドi(1行の最後のコマンドでなければなりません)...

以下は、次を含む構文です。グループ区切り記号

sed -n '/The mail system/{n;n;N;N;p;i--
       }' > output-file  # or | ...

最初のゲームの結果は次のとおりです。

<[email protected]>: host mx1.hotmail.com[65.54.188.94] said: 550
    Requested action not taken: mailbox unavailable (in reply to RCPT TO
    command)                                                                    
--

答え3

grep -A 2 -B -2 "The mail system" mbox_file

-B前の行に使用されるため、負の値を指定する必要はありません。

grep -A 2 -B 2 "The mail system" mbox_file   # This will work please check

答え4

最初の 2 行を削除するには、次にパイプします。sed

sed '1,2d'

良い

grep -A 2 "The mail system" mbox_file | sed '1,2d'

関連情報