Script perl recuperant une donnee dans un log

Fermé
anobyv Messages postés 19 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 14 août 2014 - Modifié par zipe31 le 15/04/2014 à 11:45
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 16 avril 2014 à 18:48
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



6 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
15 avril 2014 à 11:46
0
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 323
15 avril 2014 à 11:46
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
15 avril 2014 à 11:47
Aie,

Pfffff, qu'est-ce que t'es lent... Aplu d'urgence ;-D
0
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 323
15 avril 2014 à 11:49
Bin ouais, y en a qui ont quatre bras... ,-))

Ton complément d'infos ci-dessous est bien aussi.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
anobyv Messages postés 19 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 14 août 2014
15 avril 2014 à 12:56
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 :-)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 15/04/2014 à 14:27
Il te suffit de préparer une regexp matchant les lignes comportant
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
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
15 avril 2014 à 14:30
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 ;-\
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 avril 2014 à 14:53
Salut zipe31, on est d'accord :-)
0
anobyv Messages postés 19 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 14 août 2014
15 avril 2014 à 22:59
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;
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 16/04/2014 à 10:17
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
/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
0
anobyv Messages postés 19 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 14 août 2014
16 avril 2014 à 10:26
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 :)
0