comment extraire des données spécifique du fichier log - Perl - Programmation
Marsh Posté le 02-04-2014 à 15:13:20
Et vous avez écrit quoi comme code perl pour le moment?
A+,
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]]}
<>;
Marsh Posté le 02-04-2014 à 15:18:36
Bon, je dois aller planter des fraisiers je vous réponds à mon retour, dans un peu moins d'une heure.
A+,
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+,
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
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+,
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+
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 : |
A+,
Marsh Posté le 02-04-2014 à 22:03:26
Je n'en vois pas l'utilité ici.
A+,
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;
<>;
Marsh Posté le 02-04-2014 à 22:13:50
Code :
|
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+,
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+,
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