supprimer des lignes contenant une valeur donnée

supprimer des lignes contenant une valeur donnée - Perl - Programmation

Marsh Posté le 06-04-2014 à 15:01:30    

Bonjour,
j'ai un fichier log que je veux le nettoyer par supprimer les lignes qu'ont une valeur différente de sent
mon fichier est structurécomme suit:
[url]Mar  2 05:14:11 smtp p/smtp[***], relay=**.**.**:**, delay=0.**, dsn=*.*.*, status=sent (** *.0.0 Ok: queued as *******)
Mar  2 05:14:11 smtp p/smtp[***], relay=**.**.**:**, delay=0.**, dsn=*.*.*, status=deffered (** *.0.0 Ok: queued as *******)
Mar  2 05:14:11 smtp p/smtp[***], relay=**.**.**:**, delay=0.**, dsn=*.*.*, status=rejected (** *.0.0 Ok: queued as *******)[/url]

Reply

Marsh Posté le 06-04-2014 à 15:01:30   

Reply

Marsh Posté le 06-04-2014 à 15:45:57    

Vous ne voulez que la première ligne trouvée par valeur de sent?
Et les lignes sans sent, on en fait quoi?
 
En tout cas, il faut procéder ainsi:
# vous créez un hash dont les clés seront les valeurs de sent
my %sent;
Dans la boucle de lecture du fichier
while (<$fhin> ) {
  # vous testez s'il y a un sent et vous capturez son contenu dans un groupe
  if (/status=sent\s*(\([^)]+)/) {
    # vous testez si on a déjà trouvé une telle valeur de contenu
    unless ($sent{$1}) {
      # pas trouvé, on en met la valeur a 1 et on envoie sur le fichier de sortie
      $sent{$1} = 1;
      print $fhout $_;
    }
  }
  else {
     # et a vous d'envoyer ou pas une ligne sans sent en sortie en décommentant si nécessaire
     # print $fhout $_;
  }
}
 
ou bien vous ne voulez que les lignes qui ont status=sent?
C'est plus facile alors:
while (<$fhin> ) {
  print $fhout $_ if (/status=sent/);
}
 
($fhin et $fhout: handles du fichier en entrée et de celui en sortie).
 
A+,


Message édité par gilou le 06-04-2014 à 15:50:29

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-04-2014 à 20:41:17    

Je vais essayer maintenant

Reply

Marsh Posté le 06-04-2014 à 20:43:02    

les lignes sans sent je veux les supprimer

Reply

Marsh Posté le 06-04-2014 à 22:15:49    

Donc c'est ce que j'ai dit, on ne garde que les lignes avec sent.
 
while (<$fhin> ) {  
  print $fhout $_ if (/status=sent/);  
}  
 
je vous laisse faire autour ce qu'il faut (ouverture et fermeture des fichiers)
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-04-2014 à 22:46:54    

oui ça marche merci b1 :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed