Supprimer des lignes du fichier perl

Résolu/Fermé
rimrita Messages postés 18 Date d'inscription lundi 31 mars 2014 Statut Membre Dernière intervention 15 avril 2014 - Modifié par rimrita le 3/04/2014 à 18:43
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 7 avril 2014 à 13:31
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))



A voir également:

4 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
4 avril 2014 à 18:43
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
0
rimrita Messages postés 18 Date d'inscription lundi 31 mars 2014 Statut Membre Dernière intervention 15 avril 2014
6 avril 2014 à 22:55
oui oui je suis sure, c'est juste une faute de frappe
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
7 avril 2014 à 09:59
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
0
rimrita Messages postés 18 Date d'inscription lundi 31 mars 2014 Statut Membre Dernière intervention 15 avril 2014
7 avril 2014 à 11:15
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 *******)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
7 avril 2014 à 13:31
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
0