Sto analizzando un file di cassetta postale che memorizza i rapporti del server di posta elettronica per la posta elettronica non recapitata correttamente. Desidero estrarre indirizzi e-mail errati, in modo da rimuoverli dal sistema. Il file di registro è simile al seguente:
...some content...
The mail system
<slavicatomic118@hotmail.com>: 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
<oki88@optimumpro.net>: host viking.optimumpro.net[79.101.51.82] said: 550
Unknown user (in reply to RCPT TO command)
...some content...
The mail system
<sigirna_luka@yahoo.com>: host mta5.am0.yahoodns.net[74.6.140.64] said: 554
delivery error: dd This user doesn't have a yahoo.com account
(sigirna_luka@yahoo.com) [0] - mta1172.mail.sk1.yahoo.com (in reply to end
of DATA command)
...etc.
L'indirizzo e-mail arriva dopo 2 righe con "Il sistema di posta". Usare grep in questo modo mi dà la riga "Il sistema di posta" e le due righe successive:
grep -A 2 "The mail system" mbox_file
Tuttavia, non so come rimuovere la riga "Il sistema di posta" e la seconda riga vuota da questo output. Immagino di poter scrivere script PHP / Perl / Python per farlo, ma mi chiedo se ciò sia possibile con grep o qualche altro strumento standard. Ho provato a dare un offset negativo al parametro -B:
grep -A 2 -B -2 "The mail system" mbox_file
Ma grep si lamenta:
grep: -2: invalid context length argument
C'è un modo per farlo con grep?