IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Double regexp log


Sujet :

Programmation et administration système Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 161
    Points : 89
    Points
    89
    Par défaut Double regexp log
    Plop all,

    Etant toujours sur mon script de log apache et iis (ça avance petit à petit lool), j'ai actuellement un problème au niveau de mes regexp.

    Pour le moment avec seulement Apache, la regexp marche bien, même si elle n'est peut-être pas assez optimiser pour les erreurs.

    Cependant quand je rajoute une regexp pour savoir si la ligne est une ligne iis, j'ai une petite erreur.

    Voici le code des deux regexp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my $APACHE  = q{(\S+)\s+\S*\s+\S*\s+\[(\d+)\/(\D+)\/(\d+):\d+:\d+:\d+\s+\+\d+\] \"(.*) (.*)\" (\S+) (\S+) \"(.*)\" \"(.*)\"};
    my $IIS     = q{(\S+)\s+\S*\s+\S*\s+\[(\D+)\/(\d+)\/(d\+):\d+:\d+:\d+\s+\+\d+\] \"(.*) (.*)\" (\S+) (\S+) \"(.*)\" \"(.*)\"};
     
    open (Fichier, "< $file") or die "Ne peux pas ouvrir le fichier $ARGV[0]\n";
    while (my $ligne = <Fichier>){
     
    ($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a) = $ligne =~ $APACHE
    ($ip,$mois,$jour,$annee,$method,$page,$ret_code,$byte,$referer,$user_a) = $ligne =~ $IIS;
     
    ...
    J'ai juste fais une inversion pour le mois afin de tester. Du coup mes lignes de mon fichier ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    190.90.90.90 - - [15/Feb/2009:19:45:42 +0100] "GET /index.php" 100 200 "http://www.developpez.com" "Mozilla/4.0 (compatible; MSIE 7.0; Windows)"
    190.90.90.90 - - [Feb/15/2009:19:45:42 +0100] "GET /index.php" 100 200 "http://www.developpez.com" "Mozilla/4.0 (compatible; MSIE 7.0; Windows)"
    Mes lignes apache seules fonctionnent, des que j'essaye avec iis = erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value $mois in string eq at C:\log.pl line 66, <Fichier> line 2.
    C'est des erreurs juste après alors que $mois a bien été initialiser vu que si je met juste apache, ça fonctionne bien.

    Je pense pas qu'il y ai besoin de condition pour la regexp, le double "=" doit suffire non ?

    Je peux paster le code complet au besoin, je comprend pas pourquoi j'ai cette erreur.

    Si vous avez une idée, merci à vous.

    ++

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Essaie de faire plus simple, une seule regexp suffit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/usr/bin/perl
     
     
    use strict;
    use warnings;
     
     
    open my $fichier ,'<', 'test.txt' or die "Le fichier n'existe pas !";
     
    while (my $ligne = <$fichier>){
     
    	if ( $ligne =~ m{([\d.]+)[-\s]+\[(\w+)/(\w+)/(\d+)[\d:]+\s\+\d+\] "(\w+) /(.*?)" (\d+) (\d+) "(.*?)" "(.*?)"}){
     
    		my ($jour, $mois);
     
    		my ($ip,$val2, $val3, $annee,$method,$page,$ret_code,$byte,$referer,$user_a) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
     
    		# on regarde entre $2 et $3 lequel est le mois et lequel est le jour
    		if ($2 =~ m{\d+}){
    			$jour = $val2;
    			$mois = $val3;
    		}
    		else{
    			$jour = $val3;
    			$mois = $val2;			
    		}
     
    		print "ip = $ip\njour = $jour\nmois = $mois\nannée = $annee\nmeth = $method\npage = $page\ncode = $ret_code\nby = $byte\nref = $referer\nuser = $user_a\n\n\n";
    	}
     
    }
     
    close $fichier;

    Résultat
    ip = 190.90.90.90
    jour = 15
    mois = Feb
    année = 2009
    meth = GET
    page = index.php
    code = 100
    by = 200
    ref = http://www.developpez.com
    user = Mozilla/4.0 (compatible; MSIE 7.0; Windows)


    ip = 190.90.90.90
    jour = 15
    mois = Feb
    année = 2009
    meth = GET
    page = index.php
    code = 100
    by = 200
    ref = http://www.developpez.com
    user = Mozilla/4.0 (compatible; MSIE 7.0; Windows)
    -- Jasmine --

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    J'ai essayé avec m//x afin de voir ce que cela donnait, ce code fait exactement la même chose que le précédent. C'est sensé être plus lisible ... ce n'est pas l'impression que cela me donne, mais c'est peut-être une question d'habitude .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #!/usr/bin/perl
     
     
    use strict;
    use warnings;
     
    # 190.90.90.90 - - [15/Feb/2009:19:45:42 +0100] "GET /index.php" 100 200 "http://www.developpez.com" "Mozilla/4.0 (compatible; MSIE 7.0; Windows)"
     
     
    open my $fichier ,'<', 'test.txt' or die "Le fichier n'existe pas !";
     
     
    my $regexp = qr{([\d.]+)		# => ip
    		[-\s]+\[		# tirets et espaces 
    		(\w+)			# => jour ou mois
    		/
    		(\w+)			# => jour ou mois
    		/
    		(\d+)			# => année
    		[\d:]+\s\+\d+\]\s"	# heure
    		(\w+)			# => méthode
    		\s/
    		(.*?)			# => page
    		"\s
    		(\d+)			# => ret code
    		\s
    		(\d+)			# => byte
    		\s
    		"(.*?)"\s		# => referer
    		"(.*?)"			# => utilisateur
    		}x;
     
     
    while (my $ligne = <$fichier>){
     
    	if ( $ligne =~ m{$regexp}){
     
     
    		my ($jour, $mois);
     
    		my ($ip,$val2, $val3, $annee,$method,$page,$ret_code,$byte,$referer,$user_a) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
     
     
    		# on regarde entre $2 et $3 lequel est le mois et lequel est le jour
    		if ($2 =~ m{\d+}){
    			$jour = $val2;
    			$mois = $val3;
    		}
    		else{
    			$jour = $val3;
    			$mois = $val2;			
    		}
     
    		print "ip = $ip\njour = $jour\nmois = $mois\nannée = $annee\nmeth = $method\npage = $page\ncode = $ret_code\nby = $byte\nref = $referer\nuser = $user_a\n\n\n";
    	}
     
    }
     
    close $fichier;
    -- Jasmine --

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 161
    Points : 89
    Points
    89
    Par défaut
    Hello Jasmine,

    Tout d'abord merci pour ta réponse.

    Je comprend ta façon de faire, c'est vrai que c'est tout de suite plus simple

    Par contre en réalité entre le log apache et iis, il n'y a pas que la date qui diffère.

    Par exemple la date va être en premier sur iis, suivi de l'ip etc...

    L'expression régulière sera complètement différente, du coup les if ne pourront pas être fait (ou code qui va prendre pas mal de ligne en doublon).

    Voici le code complet (l'expression régulière IIS n'a pas été modifiée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
     
    #!/usr/bin/perl -w
    use strict;
    use warnings;
    use Date::Calc qw( Date_to_Days );
     
    ########## VARIABLES ##########
     
    my $choix;
    my $EXPREG  = q{(\S+)\s+\S*\s+\S*\s+\[(\d+)\/(\D+)\/(\d+):\d+:\d+:\d+\s+\+\d+\] \"(.*) (.*)\" (\S+) (\S+) \"(.*)\" \"(.*)\"};
    my $EXPREG1 = q{(\S+)\s+\S*\s+\S*\s+\[(\d+)\/(\D+)\/(\d+):\d+:\d+:\d+\s+\+\d+] \"(.*) (.*)\" (\S+) (\S+) \"(.*)\" \"(.*)\"};
    my ($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a);
    my ($lower,$upper,$date);
    my ($jourin,$jourout,$moisin,$moisout,$anneein,$anneeout);
    my (%haship,%hashpage,%hashbyte,%hashref,%hashua);
     
    ###############################
     
    #### TEST FICHIER ET DATE #####
     
    if ($#ARGV != 2){
    	print ("\nUtilisation : script.pl <fichier_log> <date_debut> <date_fin>\n");
    	print ("Exemple : script.pl log.txt 20/01/2009 20/02/2009 \n");
    	exit();
    }
     
    my $file = $ARGV[0];
    my $datein = $ARGV[1];
    my $dateout = $ARGV[2];
     
    if (!(-e $file)){
    	print $file," existe pas.\n";  
    	exit();
    }
     
    if ($datein =~/([0-9]*)\/([0-9]*)\/([0-9]*)/) {
    	$jourin = $1;
    	$moisin = $2;
    	$anneein = $3;
    }
     
    else {
    	print ("Erreur de saisie sur date_debut");
    	exit();
    }
     
    if ($dateout =~/([0-9]*)\/([0-9]*)\/([0-9]*)/) {
    	$jourout = $1;
    	$moisout = $2;
    	$anneeout = $3;
    }
     
    else {
    	print ("Erreur de saisie sur date_fin");
    	exit();
    }
     
    ###############################
     
    ############ MAIN #############
     
    open (Fichier, "< $file") or die "Ne peux pas ouvrir le fichier $ARGV[0]\n";
     
    while (my $ligne = <Fichier>){
    		($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a) = $ligne =~ $EXPREG;
    		($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a) = $ligne =~ $EXPREG1;
    		$mois = '01' if ($mois eq "Jan");
    		$mois = '02' if ($mois eq "Feb");
    		$mois = '03' if ($mois eq "Mar"); 
    		$mois = '04' if ($mois eq "May");
    		$mois = '05' if ($mois eq "Apr");
    		$mois = '06' if ($mois eq "Jun");
    		$mois = '07' if ($mois eq "Jul");
    		$mois = '08' if ($mois eq "Aug");
    		$mois = '09' if ($mois eq "Sep");
    		$mois = '10' if ($mois eq "Oct");
    		$mois = '11' if ($mois eq "Nov");
    		$mois = '12' if ($mois eq "Dec");
    		$lower = Date_to_Days($anneein,$moisin,$jourin);
    		$upper = Date_to_Days($anneeout,$moisout,$jourout);
    		$date = Date_to_Days($annee,$mois,$jour);
    		if (($date >= $lower) && ($date <= $upper)) {
    			$haship{$ip} += 1;
    			$hashpage{$page} += 1;
    			$hashbyte{$byte} += 1;
    			$hashref{$referer} += 1;
    			$hashua{$user_a} += 1;	
    		}
    }
     
    &subaffich();
    $choix = (<STDIN>);
     
    if ($choix == "1") {
    	&subip();
    }
     
    elsif ($choix == "2") {
    	&subpage();
    }
     
    elsif ($choix == "3") {
    	&subbyte();
    }
     
    elsif ($choix == "4") {
    	&subref();
    }
     
    elsif ($choix == "5") {
    	&subua();
    }
     
    ###############################
     
    ############# SUB #############
     
    sub subaffich {
    	system("cls"); # A changer pour prendre en compte clear 
     
    	print " |      Bienvenu dans le programme d\'analyseur de log        |\n";
    	print " |                Programmer par Nickname                    |\n";
    	print " |-----------------------------------------------------------|\n\n";
     
    	print " Veuillez entrer le numero correspondant a l\'action voulue :\n\n";
    	print "    1.Hits des adresses IP\n";
    	print "    2.Hits des pages les plus visitees\n";
    	print "    3.Hits des ko les plus importants\n";
    	print "    4.Hits des referer les plus presents\n";
    	print "    5.Hits des user agent les plus presents\n";	
    }
     
    sub subip {
    	system("cls"); # A changer pour prendre en compte clear 
    	open(SORTIE, ">log-ip.txt");
    	foreach $ip ( sort { $haship{$b} <=> $haship{$a} } keys %haship) {
    		print "IP : $ip a ete rencontre $haship{$ip} fois\n";
    		print SORTIE "IP : $ip a ete rencontre $haship{$ip} fois\n";
    		}
    	print "\nEcriture dans le fichier log-ip.txt en cours...\n";
    	sleep(1);
    	print "\nEcriture reussie\n";
    	print "\n ** A Bientot **\n";
    	exit;
    }
     
    sub subpage {
    	system("cls"); # A changer pour prendre en compte clear
    	open(SORTIE, ">log-page.txt"); 
    	foreach $page ( sort { $hashpage{$b} <=> $hashpage{$a} } keys %hashpage) {
    		print "Page : $page a ete rencontre $hashpage{$page} fois\n";
    		print SORTIE "Page : $page a ete rencontre $hashpage{$page} fois\n";
    		}
    	print "\nEcriture dans le fichier log-page.txt en cours...\n";
    	sleep(1);
    	print "\nEcriture reussie\n";
    	print "\n ** A Bientot **\n";
    	exit;
    }
     
    sub subbyte {
    	system("cls"); # A changer pour prendre en compte clear 
    	open(SORTIE, ">log-byte.txt");
    	foreach $byte ( sort { $hashbyte{$b} <=> $hashbyte{$a} } keys %hashbyte) {
    		print "Kilo-octets : $byte ko  - $hashbyte{$byte} fois\n";
    		print SORTIE "Kilo-octets : $byte ko  - $hashbyte{$byte} fois\n";
    		}
    	print "\nEcriture dans le fichier log-byte.txt en cours...\n";
    	sleep(1);
    	print "\nEcriture reussie\n";
    	print "\n ** A Bientot **\n";
    	exit;
    }
     
    sub subref {
    	system("cls"); # A changer pour prendre en compte clear 
    	open(SORTIE, ">log-referer.txt");
    	foreach $referer ( sort { $hashref{$b} <=> $hashref{$a} } keys %hashref) {
    		print "Referer : $referer a ete rencontre $hashref{$referer} fois\n";
    		print SORTIE "Referer : $referer a ete rencontre $hashref{$referer} fois\n";
    		}
    	print "\nEcriture dans le fichier log-referer.txt en cours...\n";
    	sleep(1);
    	print "\nEcriture reussie\n";
    	print "\n ** A Bientot **\n";
    	exit;
    }
     
    sub subua {
    	system("cls"); # A changer pour prendre en compte clear 
    	open(SORTIE, ">log-user_agent.txt");
    	foreach $user_a ( sort { $hashua{$b} <=> $hashua{$a} } keys %hashua) {
    		print "User agent : $user_a a ete rencontre $hashua{$user_a} fois\n";
    		print SORTIE "User agent : $user_a a ete rencontre $hashua{$user_a} fois\n";
    		}
    	print "\nEcriture dans le fichier log-user-_agent.txt en cours...\n";
    	sleep(1);
    	print "\nEcriture reussie\n";
    	print "\n ** A Bientot **\n";
    	exit;
    }
     
    #############################
    close(Fichier);
    Mon but était donc de détecter directement le type de ligne :
    Si ligne de type $EXPREG alors c'est Apache, si de type $EXPREG1 alors c'est IIS.

    Seulement la j'ai l'erreur cité plus haut.

    As-tu une idée sur le débogage ?

    Merci bien en tout cas

    Edit : Le mois dans le fichier de log est de type 01/Feb/2009 d'ou la conversion.

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Je ne vois pas en quoi ton code nécessite absolument 2 regexp, mais si tu ne veux pas de ma solution n'en utilisant qu'une, ça revient au même.


    Voici le problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a) = $ligne =~ $EXPREG;
    		($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a) = $ligne =~ $EXPREG1;
    utilise des if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ($ligne =~ $EXPREG){
    	($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
    }
    elsif ($ligne =~ $EXPREG1){
    	($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
    }

    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $EXPREG  = q{(\S+)\s+\S*\s+\S*\s+\[(\d+)\/(\D+)\/(\d+):\d+:\d+:\d+\s+\+\d+\] \"(.*) (.*)\" (\S+) (\S+) \"(.*)\" \"(.*)\"};
    Utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $EXPREG  = q{(\S+)\s+\S*\s+\S*\s+\[(\d+)/(\D+)/(\d+):\d+:\d+:\d+\s+\+\d+\] "(.*) (.*)" (\S+) (\S+) "(.*)" "(.*)"};
    Les doubles quotes ne doivent pas être échappés par un backslash.
    Echapper le slash par un backslash est nécessaire si tu utilises m// (il est d'ailleurs recommandé d'utiliser m{} à la place)




    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/usr/bin/perl -w
    use strict;
    use warnings;
    ... je pense que -w et use warnings font exactement la même chose.


    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (Fichier, "< $file") or die "Ne peux pas ouvrir le fichier $ARGV[0]\n";
    J'utiliserais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open my $fichier '<', $file or die "Ne peux pas ouvrir le fichier $ARGV[0]\n";
    close(Fichier);

    Le close() se balade tout au bout du code, perdu après les sous-programme.
    Je le placerais à la fin du code principal, avant la longue série fonctions.


    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $mois = '01' if ($mois eq "Jan");
    $mois = '02' if ($mois eq "Feb");
    $mois = '03' if ($mois eq "Mar"); 
    $mois = '04' if ($mois eq "May");
    $mois = '05' if ($mois eq "Apr");
    $mois = '06' if ($mois eq "Jun");
    $mois = '07' if ($mois eq "Jul");
    $mois = '08' if ($mois eq "Aug");
    $mois = '09' if ($mois eq "Sep");
    $mois = '10' if ($mois eq "Oct");
    $mois = '11' if ($mois eq "Nov");
    $mois = '12' if ($mois eq "Dec");
    J'utiliserais un hash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my %numb_mois = (
    	Jan => 01,
    	Feb => 02,
    	...
    );
     
    $mois = $numb_mois{$mois;}

    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($datein =~/([0-9]*)\/([0-9]*)\/([0-9]*)/)
    ca serait plus joli
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($datein =~ m{(\d*)/(\d*)/(\d*)})
    -- Jasmine --

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 161
    Points : 89
    Points
    89
    Par défaut
    OMG tu déchires !

    Grand merci pour ton aide !

    Je ne peux malheureusement testé le code que dans la soirée, mais tes explications sont parfaitement claires.

    J'ai même eu le droit à une optimisation

    Y a pas à dire "Le Perl Est Merveilleux" mais également sa communauté.


    /kiss

    Edit : Ah si j'ai une autre petite question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    if (!(-e $file)){
    	print $file," existe pas.\n";  
    	exit();
    }
     
    if ($datein =~/([0-9]*)\/([0-9]*)\/([0-9]*)/) {
    	$jourin = $1;
    	$moisin = $2;
    	$anneein = $3;
    }
     
    else {
    	print ("Erreur de saisie sur date_debut");
    	exit();
    }
     
    if ($dateout =~/([0-9]*)\/([0-9]*)\/([0-9]*)/) {
    	$jourout = $1;
    	$moisout = $2;
    	$anneeout = $3;
    }
     
    else {
    	print ("Erreur de saisie sur date_fin");
    	exit();
    }
    As-tu une idée pourquoi lorsque en argument si je met un truc de ce style :
    log.pl logfile 01/02/2009 truc/03/2009, le script se lance tout de même ?

    Le exit ne permet t-il pas d'arrêter le programme si la condition d 'un nombre/ nombre/nombre n'est pas remplie ?

    Thx ^_^

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Nickname Voir le message
    As-tu une idée pourquoi lorsque en argument si je met un truc de ce style :
    log.pl logfile 01/02/2009 truc/03/2009, le script se lance tout de même ?
    La dernière fois que j'ai utilisé la ligne de commande pour lancer un script date de mes études, il y a 4 ans, mais je dirais que @ARGV récupère ces 3 arguments et donc que cette partie du code fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ($#ARGV != 2){
    	print ("\nUtilisation : script.pl <fichier_log> <date_debut> <date_fin>\n");
    	print ("Exemple : script.pl log.txt 20/01/2009 20/02/2009 \n");
    	exit();
    }
     
    my $file = $ARGV[0];
    my $datein = $ARGV[1];
    my $dateout = $ARGV[2];
    Avec $ARGV[2] qui vaut truc/03/2009. A toi d'utiliser des tests afin de vérifier que l'utilisateur n'entre pas des valeurs erronées.


    Citation Envoyé par Nickname Voir le message
    Le exit ne permet t-il pas d'arrêter le programme si la condition d 'un nombre/ nombre/nombre n'est pas remplie ?

    Oui mais ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    $ARGV[2] = 'truc/03/2009';
     
    if ($ARGV[2] =~ m{(\d+)/(\d+)/(\d+)}){
             ...
    }
    else{
             exit();
    }
     
    # ça match
     
     
    if ($ARGV[2] =~ m{^(\d+)/(\d+)/(\d+)$}){
             ...
    }
    else{
             exit();
    }
     
    # ça ne match pas grâce aux ancres
    # on passe donc bien par le else


    Edit : modification des Expreg pour qu'elles correspondent au code plus haut
    -- Jasmine --

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 161
    Points : 89
    Points
    89
    Par défaut
    oki je vois

    Je suis impatient de tester ça en rentrant ce soir ^_^

    En tout cas encore un gros merci à toi.

    Passe une bonne journée et un bon week-end

  9. #9
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Nickname Voir le message
    oki je vois

    Je suis impatient de tester ça en rentrant ce soir ^_^

    En tout cas encore un gros merci à toi.

    Passe une bonne journée et un bon week-end

    Merci, bon week-end à toi également.

    A ta place j'aurais attendu d'avoir testé les modifications avant de mettre le tag 'résolu' à cette discussion ... on ne sait jamais (mais tu peux toujours l'enlever).
    -- Jasmine --

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 161
    Points : 89
    Points
    89
    Par défaut
    Yopla,

    J'ai testé ce week-end et tout marche parfaitement bien et je t'en remercie.

    J'ai ajouté une partie détection du système d'exploitation pour la commande cls et clear pour Linux.

    Il ne me reste plus qu'à voir comment faire pour ma partie subbyte.

    En effet, je fais actuellement un trie sur le nombre de fois qu'apparait tel nombre en ko, alors que je souhaite afficher les 10 IP les plus gourmandes en ko et le total en ko.

    Il va falloir que je me creuse encore un peu la tête

    En tout cas merci bien, car ton aide m'a fait pas mal avancé !

  11. #11
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bien, bien. Tu peux maintenant indiquer que ton problème de double regexp est résolu. Il vaut mieux recréer une discussion pour tes futures questions.
    -- Jasmine --

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. logging: message doublé
    Par shaiHulud dans le forum Général Python
    Réponses: 2
    Dernier message: 19/12/2013, 18h02
  2. [Log4J] Logs en double
    Par stof dans le forum Logging
    Réponses: 4
    Dernier message: 19/08/2013, 10h17
  3. fwrite écrit mes log en double sur ovh 240plan
    Par Nauar_64 dans le forum Langage
    Réponses: 12
    Dernier message: 06/05/2011, 10h06
  4. trace en double dans le fichier de log (log4j)
    Par jakouz dans le forum Logging
    Réponses: 2
    Dernier message: 27/05/2008, 18h15
  5. Impact du double archive log sur les performances du système ?
    Par condor_01 dans le forum Administration
    Réponses: 5
    Dernier message: 22/05/2008, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo