I'm parsing a mailbox file that stores e-mail server reports for unsuccessfully delivered e-mail. I wish to extract bad e-mail addresses, so that I remove them from the system. The log file looks like this:
...some content... The mail system <email@example.com>: host mx1.hotmail.com[220.127.116.11] said: 550 Requested action not taken: mailbox unavailable (in reply to RCPT TO command) ...some content... The mail system <firstname.lastname@example.org>: host viking.optimumpro.net[18.104.22.168] said: 550 Unknown user (in reply to RCPT TO command) ...some content... The mail system <email@example.com>: host mta5.am0.yahoodns.net[22.214.171.124] said: 554 delivery error: dd This user doesn't have a yahoo.com account (firstname.lastname@example.org)  - mta1172.mail.sk1.yahoo.com (in reply to end of DATA command) ...etc.
E-mail address comes 2 lines after a line with "The mail system". Using grep like this gives me the "The mail system" line and the next two lines:
grep -A 2 "The mail system" mbox_file
However, I don't know how to remove the "The mail system" line and the second empty line from this output. I guess I could write PHP/Perl/Python script to do it, but I wonder if this is possible with grep or some other standard tool. I tried to give negative offset to -B parameter:
grep -A 2 -B -2 "The mail system" mbox_file
But grep complains:
grep: -2: invalid context length argument
Is there a way to do this with grep?