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   -
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



A voir également:

6 réponses

zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
0
Chris 94 Messages postés 54087 Date d'inscription   Statut Modérateur Dernière intervention   7 345
 
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   Statut Contributeur Dernière intervention   6 431
 
Aie,

Pfffff, qu'est-ce que t'es lent... Aplu d'urgence ;-D
0
Chris 94 Messages postés 54087 Date d'inscription   Statut Modérateur Dernière intervention   7 345
 
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   Statut Membre Dernière intervention  
 
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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   Statut Contributeur Dernière intervention   6 431
 
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut zipe31, on est d'accord :-)
0
anobyv Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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   Statut Membre Dernière intervention  
 
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