Supprimer des lignes du fichier perl [Résolu/Fermé]

Signaler
Messages postés
18
Date d'inscription
lundi 31 mars 2014
Statut
Membre
Dernière intervention
15 avril 2014
-
Messages postés
5531
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
6 mai 2021
-
Bonjour,
je veux un script en perl qui supprime les lignes du fichier log qui ont un status <> sent,
le fichier est structuré comme ci

Mar 2 04:18:32 smtp postfix/smtp[****]: 1****.***.***.***: to=<****@****>, relay=1****.***.***.***[1****.***.***.***]:25, delay=****, delays=******, dsn=4.1.2, status=deferred (host ****.****[1****.***.***.***] said: 55 1 <.1.2*****@****>: Recipient address rejected: Domain not found (in reply to RCPT TO command))
Mar 2 05:19:06 s p/cleanup[****]: 0: message-id=<****@nnnn>
Mar 2 04:18:32 smtp postfix/smtp[****]: 1****.***.***.***: to=<****@****>, relay=1****.***.***.***[1****.***.***.***]:25, delay=****, delays=******, dsn=4.1.2, status=deferred (host ****.****[1****.***.***.***] said: 55 1 <.1.2*****@****>: Recipient address rejected: Domain not found (in reply to RCPT TO command))
Mar 2 05:19:06 s p/cleanup[****]: 0: message-id=<****@nnnn>
Mar 2 04:18:32 smtp po/smtp[****]: 1****.***.***.***: to=<****@****>, relay=1****.***.***.***[1****.***.***.***]:25, delay=****, delays=******, dsn=4.1.2, status=deferred (host ****.****[1****.***.***.***] said: 55 1 <.1.2*****@****>: Recipient address rejected: Domain not found (in reply to RCPT TO command))
Mar 2 05:19:06 s p/cleanup[****]: 0: message-id=<****@nnnn>
Mar 2 04:18:32 smtp po/smtp[****]: 1****.***.***.***: to=<****@****>, relay=1****.***.***.***[1****.***.***.***]:25, delay=****, delays=******, dsn=4.1.2, status=sens (host ****.****[1****.***.***.***] said: 1 <.1.2*****@****>: Recipient address rejected: Domain not found (in reply to RCPT TO command))



4 réponses

Messages postés
5531
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
6 mai 2021
933
Bonjour,

La dernière ligne indique "status=sens" et non pas "status=sent" et ce qui suit indique visiblement une erreur. Tu es sûre que les lignes "sent" se présentent comme cela ?


Dal
Messages postés
18
Date d'inscription
lundi 31 mars 2014
Statut
Membre
Dernière intervention
15 avril 2014

oui oui je suis sure, c'est juste une faute de frappe
Messages postés
5531
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
6 mai 2021
933
Comme tu dis que c'est une faute de frappe, cela confirme mes doutes.

Je pense que, pour faire ton exemple, tu as pris une ligne "status=deferred" que tu as changée en "status=sens" (avec une faute), et du coup, même si on met "status=sent" à la place, ce qui suit n'est pas représentatif de ce qu'est un message correctement envoyé, car ce qui suit indique une erreur "Recipient address rejected: Domain not found".

Donc, je pense que ta source de données d'exemple n'est pas correcte et n'est pas représentative de ce qu'est vraiment un e-mail "sent".

Peux-tu stp, confirmer cela et donner une ligne "sent" réelle et représentative.


Dal
Messages postés
18
Date d'inscription
lundi 31 mars 2014
Statut
Membre
Dernière intervention
15 avril 2014

voila une ligne qui contient sent correctement

Mar  2 05:14:11 smtp p/smtp[***]: ****: to=<***@****>, relay=***.***.**.**[***.***.**.***]:25, delay=0.15, delays=./0.0/0./0.0, dsn=0.0.0, status=sent (**** *.0.0 Ok: queued as *******)
Messages postés
5531
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
6 mai 2021
933
Donc, le plus simple est de faire un grep avec une négation de la regexp matchant une ligne correcte status=sent

Quelque chose comme cela :

#!/usr/bin/perl

use strict;
use warnings;

open LIRE,"fichier_test.txt"
    or die "E/S : $!\n";

my @tmp = <LIRE>;
my @log = grep {!/.*status=sent.*Ok: queued as /} @tmp;                                     

print @log;


Dal