Script perl recuperant une donnee dans un log
anobyv
Messages postés
19
Date d'inscription
Statut
Membre
Dernière intervention
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je suis un debutant dans la programmation Perl et je dois ecrire un script perl qui recupere une valeur dans un fichier log
ex du fichier log :
04/15/2014 11:41:52 AM - SPINE: Poller[0] Host[14] ERROR: Empty result [172.20.63.215]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.215 demetero get dscp-out-rt-afa_drop 194'
04/15/2014 11:41:19 AM - SPINE: Poller[0] Host[14] ERROR: Empty result [172.20.63.215]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.215 demetero get dscp-out-d3 194'
04/15/2014 11:40:54 AM - SPINE: Poller[0] Host[16] ERROR: Empty result [172.20.63.217]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.217 demetero get dscp-out-d3-afa_drop 50'
04/15/2014 11:40:53 AM - SPINE: Poller[0] Host[14] ERROR: Empty result [172.20.63.215]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.215 demetero get dscp-out-d3-afa 18'
04/15/2014 11:40:34 AM - SPINE: Poller[0] Host[14] ERROR: Empty result [172.20.63.215]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.215 demetero get dscp-out-rtvi-afa 192'
04/15/2014 11:40:11 AM - SPINE: Poller[0] Host[16] ERROR: Empty result [172.20.63.217]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.217 demetero get dscp-out-rtvi-afa 50'
04/15/2014 11:39:20 AM - SYSTEM THOLD STATS: Time:3.2504 Tholds:1074 TotalHosts:90 DownHosts:0 NewDownHosts:0
04/15/2014 11:39:16 AM - SYSTEM STATS: Time:255.1539 Method:spine Processes:1 Threads:13 Hosts:91 HostsPerProcess:91 DataSources:7356 RRDsProcessed:2528
04/15/2014 11:38:43 AM - SPINE: Poller[0] Host[17] ERROR: Empty result [172.20.63.218]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.218 demetero get dscp-out-d3-afa_drop 130'
donc ce script recupere à chaque fois la valeur du dernier temps (time correspondant seulement à SYSTEM STATS) sachant que c'est un fichier qui s'actualise tous les 10 sec
Merci de votre aide
je suis un debutant dans la programmation Perl et je dois ecrire un script perl qui recupere une valeur dans un fichier log
ex du fichier log :
04/15/2014 11:41:52 AM - SPINE: Poller[0] Host[14] ERROR: Empty result [172.20.63.215]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.215 demetero get dscp-out-rt-afa_drop 194'
04/15/2014 11:41:19 AM - SPINE: Poller[0] Host[14] ERROR: Empty result [172.20.63.215]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.215 demetero get dscp-out-d3 194'
04/15/2014 11:40:54 AM - SPINE: Poller[0] Host[16] ERROR: Empty result [172.20.63.217]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.217 demetero get dscp-out-d3-afa_drop 50'
04/15/2014 11:40:53 AM - SPINE: Poller[0] Host[14] ERROR: Empty result [172.20.63.215]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.215 demetero get dscp-out-d3-afa 18'
04/15/2014 11:40:34 AM - SPINE: Poller[0] Host[14] ERROR: Empty result [172.20.63.215]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.215 demetero get dscp-out-rtvi-afa 192'
04/15/2014 11:40:11 AM - SPINE: Poller[0] Host[16] ERROR: Empty result [172.20.63.217]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.217 demetero get dscp-out-rtvi-afa 50'
04/15/2014 11:39:20 AM - SYSTEM THOLD STATS: Time:3.2504 Tholds:1074 TotalHosts:90 DownHosts:0 NewDownHosts:0
04/15/2014 11:39:16 AM - SYSTEM STATS: Time:255.1539 Method:spine Processes:1 Threads:13 Hosts:91 HostsPerProcess:91 DataSources:7356 RRDsProcessed:2528
04/15/2014 11:38:43 AM - SPINE: Poller[0] Host[17] ERROR: Empty result [172.20.63.218]: '/usr/bin/perl /var/www/html/cacti/prod/scripts/cisco_if-cos.pl 172.20.63.218 demetero get dscp-out-d3-afa_drop 130'
donc ce script recupere à chaque fois la valeur du dernier temps (time correspondant seulement à SYSTEM STATS) sachant que c'est un fichier qui s'actualise tous les 10 sec
Merci de votre aide
A voir également:
- Script perl recuperant une donnee dans un log
- Script vidéo youtube - Guide
- Comment recuperer un message supprimé sur whatsapp - Guide
- Comment récupérer un document dans le presse-papier samsung - Guide
- Mas script - Accueil - Windows
- Comment recuperer une video sur youtube - Guide
6 réponses
Bonjour,
Urgent ? Vraiment ? Serait-ce à rendre rapidement ?..
Les réponses sont données gratuitement par des personnes bénévoles selon leurs compétences et le temps dont elles disposent. Pour les vraies urgences, il est recommandé de consulter un professionnel.
Urgent ? Vraiment ? Serait-ce à rendre rapidement ?..
Les réponses sont données gratuitement par des personnes bénévoles selon leurs compétences et le temps dont elles disposent. Pour les vraies urgences, il est recommandé de consulter un professionnel.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
l'intention n'etait pas mauvaise ou presser qui que ce soit !!!!!
j'ai commencé a lire la doc sur Perl.....
votre aide est la bienvenue à votre guise :-)
j'ai commencé a lire la doc sur Perl.....
votre aide est la bienvenue à votre guise :-)
Il te suffit de préparer une regexp matchant les lignes comportant
Si tu débutes en Perl, pourquoi utilises tu ce langage pour faire ce script ? Utilise un autre langage dont tu serais plus familier. Tu pourrais le faire facilement avec grep et sed sous Linux / Unix, par exemple.
S'il s'agit réellement d'un exercice, ou que Perl t'est imposé, je t'encourage à coder toi même ton script, et si tu as une question précise, de la poser ici, avec ton code et la partie te posant pb.
Et, s'il s'agit réellement d'un exercice, lire le lien proposé par zipe31 ci-dessous s'impose (et lire ton cours et tes manuels).
Dal
SYSTEM STATS, avec une capture de l'heure, de passer toutes tes lignes du fichier dessus avec une boucle, et de restituer en fin de boucle la dernière valeur affectée (si au moins une ligne a matché).
Si tu débutes en Perl, pourquoi utilises tu ce langage pour faire ce script ? Utilise un autre langage dont tu serais plus familier. Tu pourrais le faire facilement avec grep et sed sous Linux / Unix, par exemple.
S'il s'agit réellement d'un exercice, ou que Perl t'est imposé, je t'encourage à coder toi même ton script, et si tu as une question précise, de la poser ici, avec ton code et la partie te posant pb.
Et, s'il s'agit réellement d'un exercice, lire le lien proposé par zipe31 ci-dessous s'impose (et lire ton cours et tes manuels).
Dal
Salut [Dal],
Et, s'il s'agit réellement d'un exercice, lire le lien proposé par zipe31 ci-dessous s'impose.Et même s'il ne s'agit pas d'un exercice, on apprend plus facilement en essayant par soi même, qu'en trouvant du tout cuit fait par un autre, d'autant plus que bien souvent ses propres erreurs sont bien plus constructives que n'importe quel cours ;-\
J'ai essayé avec la doc que jai lu
Le code :
#!/usr/local/bin/perl
use strict;
use warnings;
my $ligne;
my $filename = "C:\\fichier_test.txt";
my $fh;
open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture";
foreach $ligne(<$fh>)
{
if ($ligne =~ /STATS:Time =<([^>]+*/){
print "time=$1";
}
}
close $fh;
Le code :
#!/usr/local/bin/perl
use strict;
use warnings;
my $ligne;
my $filename = "C:\\fichier_test.txt";
my $fh;
open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture";
foreach $ligne(<$fh>)
{
if ($ligne =~ /STATS:Time =<([^>]+*/){
print "time=$1";
}
}
close $fh;
les lignes qui t'intéressent contiennent quelque chose du type :
04/15/2014 11:39:16 AM - SYSTEM STATS: Time:255.1539 Method:spine Processes:1 Threads:13 Hosts:91 HostsPerProcess:91 DataSources:7356 RRDsProcessed:2528
et ce que tu veux capturer est ce qui est en gras.
ta regexp
- tu matches "STATS", mais cela ne te permet pas de différencier SYSTEM STATS (que tu veux) de SYSTEM THOLD STATS (dont tu ne veux pas)
- tu ajoutes ":Time =<" qui ne figure nulle part sur ta ligne, ce qui y figure c'est ": Time:"
- tu ouvres une parenthèse capturante que tu ne fermes pas
- tu ne captures pas les données numériques séparées par un point qui t'intéressent et tu cumules les quantificateurs + et * ce qui se signifie rien et produit une erreur de syntaxe
https://perldoc.perl.org/perlre#Character-Classes-and-other-Special-Escapes
pour matcher des chiffres séparés par un point, cela serait plutôt :
ou si tu tiens à utiliser une classe avec une négation de caractères, fait une négation sur l'espace, car tes données ne sont pas terminées par un ">".
Dal
04/15/2014 11:39:16 AM - SYSTEM STATS: Time:255.1539 Method:spine Processes:1 Threads:13 Hosts:91 HostsPerProcess:91 DataSources:7356 RRDsProcessed:2528
et ce que tu veux capturer est ce qui est en gras.
ta regexp
/STATS:Time =<([^>]+*/n'est pas appropriée (outre le fait qu'elle ne compile pas), car :
- tu matches "STATS", mais cela ne te permet pas de différencier SYSTEM STATS (que tu veux) de SYSTEM THOLD STATS (dont tu ne veux pas)
- tu ajoutes ":Time =<" qui ne figure nulle part sur ta ligne, ce qui y figure c'est ": Time:"
- tu ouvres une parenthèse capturante que tu ne fermes pas
- tu ne captures pas les données numériques séparées par un point qui t'intéressent et tu cumules les quantificateurs + et * ce qui se signifie rien et produit une erreur de syntaxe
https://perldoc.perl.org/perlre#Character-Classes-and-other-Special-Escapes
pour matcher des chiffres séparés par un point, cela serait plutôt :
\d+\.\d+
ou si tu tiens à utiliser une classe avec une négation de caractères, fait une négation sur l'espace, car tes données ne sont pas terminées par un ">".
Dal
Merci beaucoup de ton retour
j'ai du mal encore avec les expressions regulières mais je suis sur la doc now.je vais lire et essayer d'ameliorer le code avec tes remarques
Merci encore :)
j'ai du mal encore avec les expressions regulières mais je suis sur la doc now.je vais lire et essayer d'ameliorer le code avec tes remarques
Merci encore :)