Supprimer des lignes du fichier perl

Résolu
rimrita Messages postés 22 Statut Membre -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
  2. rimrita Messages postés 22 Statut Membre
     
    oui oui je suis sure, c'est juste une faute de frappe
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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
  3. rimrita Messages postés 22 Statut Membre
     
    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
  4. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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