Parse log : affucher uniquement les bonnes lignes

Résolu
LezardMoo Messages postés 554 Date d'inscription   Statut Membre Dernière intervention   -  
LezardMoo Messages postés 554 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour tout le monde !!

je suis en train de faire un petit script d'analyse du fichier log "mail.info"

Voici une première ébauche du script (ce n'est pas définitif, surtout si vous trouvez des choses a redire, je suis preneur ^^)


#!/usr/bin/perl

use strict;
use warnings;
use POSIX qw(strftime);

my $mailog = "mail.info";


open(MAIL,"<$mailog") or die("err open $mailog");
while (my $lines = <MAIL>) {
########## DATE%d ##########
my $date = strftime "%d", localtime;
#my $date = 10;
if($date =~ /0./) {
my @date1 = split(/0/, $date);
print $date1[1];
}else {
print "$date\n";
}
############################

########## USER ##########
my @userSplit = split(/</, $lines);
#print "$userSplit[1]\n";

my @user = split(/@/, $userSplit[1]);
print "$user[0]\n";
##########################

########## TIME ##########
#my @timeSplit = split(/ /,$lines);
#print $timeSplit[4];
my @timeSplit = split(/ /, $lines);
my @time = split(/:/, $timeSplit[3]);
my $realTime = "$time[0]:$time[1]";
print "$realTime\n";

##########################
}
close(MAIL);

Donc voila, dans ce bout de code je récupère en premier lieu la date ensuite le user et pour finir l'heure du log.

Ma demande porte sur l'utilisation de la date ainsi que de l'heure, j'aimerais pouvoir afficher uniquement les lignes contenant la date et l'heure du jour pour ne pas avoir a parser les lignes qui date d'il y a trois semaines(ce qui en plus serait néfaste pour la suite du programme) mais je ne vois pas comment faire.

j'ai testé des trucs du genre


if(/$date/) {}

mais le retour c'est ca


:q!
Use of uninitialized value $_ in print at...

J'ai lu quelque part que ca signifiait que la variable était vide... hum c'est la première à être rempli.... ^^

Merci d'avance ( :





:(){ :|:& };:
A voir également:

3 réponses


 
Bonjour LezardMoo,

Tu dis "j'aimerais pouvoir afficher uniquement les lignes contenant la date et l'heure du jour". Je suppose que tu veux dire "j'aimerais pouvoir afficher uniquement les lignes contenant la date du jour"

Peux-tu donner des exemples de lignes de ton "mail.info" ?

Ton format n'a pas l'air d'être le même que le mien sur ma Debian.


Dal
0
LezardMoo Messages postés 554 Date d'inscription   Statut Membre Dernière intervention   14
 
Salut Dal,

oui effectivement c'est bien ce que j'ai voulu dire ^^, l'heure me servira après pour detecter le nombre de mails envoyés sur un laps de temps donné.

voici un exemple de ligne de mail.info (je suis aussi sur Debian


Jan 6 18:02:44 testmail postfix/pickup[16791]: 726D543494: uid=0 from=<root>
Jan 7 22:40:54 testmail postfix/pickup[16791]: 745D543445: uid=0 from=<root>
Jan 8 01:08:34 testmail postfix/pickup[16791]: 720D544594: uid=0 from=<root>

donc je voudrais pouvoir afficher uniquement la lignes du 7 janvier
Je suis encore en train de tester, j'ai deja réussis mais impossible de retrouver ce f****ng script...

Il me semble que dedans j'utilisais des regex du genre


if($lines =~ /$date/) {
print lines;
}

mais à l'évidence, ce n'était pas ca puisque ca ne fonctionne pas, il m'affiche $lines sans matcher.

j'ai aussi testé ca


$lines2 = $lines =~ /$date/

marche pas non plus...
0
LezardMoo Messages postés 554 Date d'inscription   Statut Membre Dernière intervention   14
 
heuuuuuuuuuu bon je vais surement passer pour un con mais j'ai trouvé mon erreur quand je match, je n'ai pas mis de "m" ce FUCKIN "m"

donc


if($lines =~ /$date/) {
print lines;
}
devient

if($lines =~ m/$date/) {
print lines;
}

Si je fais cette erreur bête c'est parce qu'il me semble avoir lu quelque part que dans perl faire m/$pattern/ ou /$pattern/ est la meme chose au niveau du matching.

Donc nouvelle question, cette règle je l'ai inventé ?? ou je confond avec du sed ou un autre langage ?


:(){ :|:& };:
0