正常に送信されなかった電子メールの電子メールサーバーレポートを保存するメールボックスファイルを解析しています。間違ったメールアドレスを抽出してシステムから削除したいと思います。ログファイルは次のとおりです。
...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行目が残り、p
sed printコマンドで印刷されます。先行-n
オプションは他のすべての印刷をブロックします。
次の2行を印刷するには、これは単なる例です。次のステップと印刷 n;p
もう2回。
sed -n '/The mail system/{n; n;p; n;p; n;p}'
必要な行の次の行の読み取りは累積され、単一のブロックとして印刷できますp
。 N
次の行を読み、パターンスペースに追加します。
最終削除バージョンは次のとおりです。
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'