J'analyse un fichier de boîte aux lettres qui stocke les rapports du serveur de messagerie pour les courriers électroniques remis en échec. Je souhaite extraire les mauvaises adresses électroniques afin de les supprimer du système. Le fichier journal ressemble à ceci:
...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'adresse e-mail vient 2 lignes après une ligne avec "Le système de messagerie". Utiliser grep comme ceci me donne la ligne "Le système de messagerie" et les deux lignes suivantes:
grep -A 2 "The mail system" mbox_file
Cependant, je ne sais pas comment supprimer la ligne "Le système de messagerie" et la deuxième ligne vide de cette sortie. Je suppose que je pourrais écrire un script PHP / Perl / Python pour le faire, mais je me demande si cela est possible avec grep ou un autre outil standard. J'ai essayé de donner un décalage négatif au paramètre -B:
grep -A 2 -B -2 "The mail system" mbox_file
Mais grep se plaint:
grep: -2: invalid context length argument
Existe-t-il un moyen de faire cela avec grep?