OVH Cloud OVH Cloud

lire la ligne suivante...

4 réponses
Avatar
kurtz_le_pirate
bonjour,

encore une question : le script ci-dessous permet d'extraire les
erreurs d'un fichier de log.
l'erreur est sur 3 lignes. l'erreur est signalée par la présence du
mot 'error' dans la ligne 2.
il faut détecter l'erreur et affiché la ligne avant et après. pour
celle d'avant, j'ai reussi.
pour celle d'après... je sèche.

---------------------------------------------------------------------------------------------------------------
#!/usr/bin/perl -w
use Strict;

my $fileName = "ExMerge.log";
open (LOGFILE,"<",$fileName) or die "\nOuverture de $fileName
impossible !\nErreur : $!\n";

my $currentLine;
my $previousline;
my $nextline;

while ($currentLine=<LOGFILE>) {
if ($currentLine =~ m/error/i) {
print "1:$previousline";
print "2:$currentLine";
$nextLine = la_prochaine_ligne_dans_le_fichier;
print "3:$nextline";
}
$previousline=$currentLine;
chop($previousline);
}

close LOGFILE;

---------------------------------------------------------------------------------------------------------------

si vous avez une idée.
merci

4 réponses

Avatar
Jul
kurtz_le_pirate a formulé la demande :
bonjour,

encore une question : le script ci-dessous permet d'extraire les
erreurs d'un fichier de log.
l'erreur est sur 3 lignes. l'erreur est signalée par la présence du
mot 'error' dans la ligne 2.
il faut détecter l'erreur et affiché la ligne avant et après. pour
celle d'avant, j'ai reussi.
pour celle d'après... je sèche.


$nextline = <LOGFILE> ?

--
Jul... réapparru comme par enchantement

Avatar
kurtz_le_pirate
"Jul" a écrit dans le message de news:

: kurtz_le_pirate a formulé la demande :
: > bonjour,
: >
: > encore une question : le script ci-dessous permet d'extraire les
: > erreurs d'un fichier de log.
: > l'erreur est sur 3 lignes. l'erreur est signalée par la présence
du
: > mot 'error' dans la ligne 2.
: > il faut détecter l'erreur et affiché la ligne avant et après. pour
: > celle d'avant, j'ai reussi.
: > pour celle d'après... je sèche.
:
: $nextline = <LOGFILE> ?
:
: --
: Jul... réapparru comme par enchantement


trop simple !!!!! merci pour ta ré apparrition Jul
Avatar
Klaus
"kurtz_le_pirate" wrote in message
news:42ee208a$0$27329$
bonjour,

encore une question : le script ci-dessous permet d'extraire les
erreurs d'un fichier de log.
l'erreur est sur 3 lignes. l'erreur est signalée par la présence du
mot 'error' dans la ligne 2.
il faut détecter l'erreur et affiché la ligne avant et après. pour
celle d'avant, j'ai reussi.
pour celle d'après... je sèche.



D'abort quelques corrections "standard" dans le programme:

--------------------------------------------------------------------------
-------------------------------------

#!/usr/bin/perl -w
use Strict;
^^^^^^^^^^

use strict;

il faut respecter les minuscules, sinon le strict ne fonctionne pas et
aucune erreur de syntaxe n'est signalé, comme par exemple le "L" en
majuscules dans "$nextLine = ..." avec le "l" en minuscules dans "my
$nextline".

my $fileName = "ExMerge.log";
open (LOGFILE,"<",$fileName) or die "nOuverture de $fileName
impossible !nErreur : $!n";

my $currentLine;
my $previousline;
my $nextline;

while ($currentLine=<LOGFILE>) {
^^^^^^^^^^^^^^

while (defined($currentLine=<LOGFILE>)) {

Il faut ajouter la fonction defined(...) comme ci-dessous, sinon la boucle
s'arrête sur une simple ligne vide ou même sur la chiffre "0". Une autre
solution serait d'utiliser la construction standard "while (<LOGFILE>) {
$currentLine= $_; ..." --> cette construction fait le contrôle
"defined(...)" automatiquement.

Pour supprimer toute fin de ligne correspondant à la valeur courante de $/
("n"), il vaut mieux utiliser la fonction "chomp", et non pas "chop". -->
"chomp" respecte $/, mais "chop" ne le respecte pas. En plus, il vaut mieux
placer la fonction "chomp" au debut dans la boucle avec $currentLine comme
paramètre, juste derrière la lecture de $currentLine (et non pas à la fin
avec $previousline comme paramètre).

if ($currentLine =~ m/error/i) {
print "1:$previousline";
print "2:$currentLine";
$nextLine = la_prochaine_ligne_dans_le_fichier;
^^^^^^^^^


$nextline = ...
Erreur de syntaxe: il faut mettre le "L" dans "$nextLine" en minuscules.
(l'expression "... = la_prochaine_ligne_dans_le_fichier" est également une
erreur de syntaxe, mais voir ma proposition ci-dessous pour la remplacer)

print "3:$nextline";
}
$previousline=$currentLine;
chop($previousline);
^^^^^^^^

Comme avant, remplacer "chop($previousline)" par "chomp($currentLine)" et
déplacer vers le haut de la boucle

}

close LOGFILE;

--------------------------------------------------------------------------
-------------------------------------


si vous avez une idée.
merci


Voici mon idée: je déplace la lecture de <LOGFILE>, le "chomp" et la gestion
des lignes ($currentLine, $previousline et $nextline) dans une nouvelle
fonction "lecture()":
=========================== use strict;
use warnings;

my $fileName = 'ExMerge.log';
open (LOGFILE,'<',$fileName) or die "Ouverture de $fileName impossible! -
Erreur: $!";

my $currentLine = '';
my $previousline = '';
my $nextline = '';

while (lecture()) {
if ($currentLine =~ m/error/i) {
print "n1:$previouslinen";
print "2:$currentLinen";
print "3:$nextlinen";
}
}

close LOGFILE;

sub lecture {
$previousline = $currentLine;
$currentLine = $nextline;
if (defined($nextline = <LOGFILE>)) { chomp($nextline) }
return defined($currentLine);
}
===========================
avec le fichier 'ExMerge.log':
*********************************
test01
test02
test03 Error xxx
test04
test05
test06
test07
test08 Error xxx
test09
test10
*********************************

le résultat est:
+++++++++++++++++++++++++++++++

1:test02
2:test03 Error xxx
3:test04

1:test07
2:test08 Error xxx
3:test09
+++++++++++++++++++++++++++++++

--
Klaus

Avatar
kurtz_le_pirate
"Klaus" a écrit dans le message de news:
42ee4ba5$0$18769$
:
: D'abort quelques corrections "standard" dans le programme:
: ...
: Voici mon idée: je déplace la lecture de <LOGFILE>, le "chomp" et la
gestion
: des lignes ($currentLine, $previousline et $nextline) dans une
nouvelle
: fonction "lecture()":
: ...
: --
: Klaus
:

très intéressant tout ça...
moi j'en étais arrivé la :
-------------------------------------------------
#!/usr/bin/perl -w

use strict;

my $fileName = "ExMerge.log";
open (LOGFILE,"<",$fileName)
or die "nOuverture de $fileName impossible !nErreur : $!n";

my $previousline;
my $nextline;

while (<LOGFILE>) {
chomp;
if (/^start/io) {
print "*** $_n";
}
elsif (/error/io) {
print "$previousline";
print $_;
$nextline = <LOGFILE>;
chomp($nextline);
print "$nextlinenn";
}
$previousline=$_;
}

close LOGFILE;

-------------------------------------------------

merci encore klaus