comment extraire des données spécifique du fichier log

comment extraire des données spécifique du fichier log - Perl - Programmation

Marsh Posté le 02-04-2014 à 15:00:31    

je veux extraire des données spécifique du fichier log de la forme:

 
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 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>
 
[]je veux récupérer le msg-id ,status, relay [/]
 
mon essai ne mache toujours pas je suis null

Reply

Marsh Posté le 02-04-2014 à 15:00:31   

Reply

Marsh Posté le 02-04-2014 à 15:13:20    

Et vous avez écrit quoi comme code perl pour le moment?
 
A+,


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

Marsh Posté le 02-04-2014 à 15:17:10    

j'ai commencé par ceci:
 
#!/usr/bin/perl
use strict;use warnings;
my $filename = "fichier_test.txt";
 
open LIRE,"fichier_test.txt"
     or die "E/S : $!\n";
 
my @tmp = <LIRE>;
my @log = grep {/status/} @tmp;
 
grep {s/.*(message-id\s*relay).*(status.*)/$1: $2/} @log;
print map  {$_->[0]}
       
      map  {[$_,(split /=/)[1]]}
   
<>;

Reply

Marsh Posté le 02-04-2014 à 15:18:36    

Bon, je dois aller planter des fraisiers :D je vous réponds à mon retour, dans un peu moins d'une heure.
 
A+,


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

Marsh Posté le 02-04-2014 à 15:21:18    

je vous attend, have a nice time  
A+

Reply

Marsh Posté le 02-04-2014 à 16:36:01    

#!/usr/bin/perl
use strict;
use warnings;
use autodie;
 
my $filename = 'fichier_test.txt';
 
open my $fh, "<", $filename;
 
while (<$fh> ) {
 # et ici on va faire des choses ligne à ligne
}
close $fh;
 
Bon, déjà, vous ne pouvez pas récupérer les message-id, relay et status sur une même ligne, vu que les message-id sont sur une ligne et les relay et status sur une autre.
Donc votre fichier est structuré comment?
 
A+,


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

Marsh Posté le 02-04-2014 à 19:29:34    

il y'a des ligne qui n'ont pas de message id lorsque leurs status est regected c.à.d <> send

Reply

Marsh Posté le 02-04-2014 à 19:47:11    

Ce sont les seules que vous avez donné en exemple.
 
Bon, vous voulez afficher quoi au final?
 
A+,


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

Marsh Posté le 02-04-2014 à 19:57:04    

il y'a des ligne qui n'ont pas les delay, message-id, status ils nous interresse pas je veux juste afficher ces données à partir des lignes qu'ils contient
A+

Reply

Marsh Posté le 02-04-2014 à 21:39:31    

OK!
Mais une ligne complète, en exemple, ça aurait aidé.
Sans plus d'infos sur la structure de vos lignes de log, je ne peux que proposer qque chose comme:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my $filename = 'fichier_test.txt';
  7.  
  8. open my $fh, "<", $filename;
  9.  
  10. while (<$fh> ) {
  11. if (/message-id=<([^>]+)>.*relay=([^,]+),.*status=(\S+)/) {
  12.   print "$1 - $2 - $3\n";
  13.  }
  14. }
  15. close $fh;


 
A+,


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

Marsh Posté le 02-04-2014 à 21:39:31   

Reply

Marsh Posté le 02-04-2014 à 21:43:43    

On a pas besoin d'utiliser grep?

Reply

Marsh Posté le 02-04-2014 à 22:03:26    

Je n'en vois pas l'utilité ici.
 
A+,


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

Marsh Posté le 02-04-2014 à 22:09:03    

oki, votre code n'a rien affiché  j'ai modifié comme ça mais en vain
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
 
my $filename = 'fichier_test.txt';
 
open my $fh, "<", $filename;
 
while (<$fh> ) {
my $line = $_;
 if ($line =~ /message-id=<([^>]+)>.*relay=([^,]+),.*status=(\S+)/) {
   print "delays=$1, status=$2 , message-id=$3 \n\n";
  }
}
close $fh;
<>;

Reply

Marsh Posté le 02-04-2014 à 22:13:50    

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. my $filename = 'fichier_test.txt';
  6. open my $fh, "<", $filename;
  7. while (<$fh> ) {
  8. my $line = $_;
  9. if ($line =~ /message-id=<([^>]+)>.*relay=([^,]+),.*status=(\S+)/) {
  10.    print "relays=$1, status=$2 , message-id=$3 \n\n";
  11.   }
  12. }
  13. close $fh;
  14. <>;

Reply

Marsh Posté le 03-04-2014 à 11:10:18    

On pourrait savoir pourquoi vous rajoutez un <>; totalement inutile en fin de programme?
 
et faire  
my $line = $_;
if ($line =~ /message-id=<([^>]+)>.*relay=([^,]+),.*status=(\S+)/) {
 
c'est exactement comme faire  
if (/message-id=<([^>]+)>.*relay=([^,]+),.*status=(\S+)/) {
mais en moins efficace.
 
A la limite si vous tenez a une variable $line faites plutôt
while (my $line = <$fh> ) {
if ($line =~ /message-id=<([^>]+)>.*relay=([^,]+),.*status=(\S+)/) {
ça sera un peu plus efficace  (mais un peu moins qu'utiliser les variables par défaut comme $_)
 
A+,


Message édité par gilou le 03-04-2014 à 11:18:20

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

Marsh Posté le 03-04-2014 à 11:12:39    

> votre code n'a rien affiché  j'ai modifié comme ça mais en vain  
 
Ben oui, puisque je suis obligé de deviner à l'aveugle la structure de vos lignes de log.
C'est pourtant pas faute d'avoir demande à ce que vous m'en fournissiez une ou deux de valables.
 
A+,


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

Sujets relatifs:

Leave a Replay

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