Traiter des valeurs avec perl dans un log
Il m'arrive régulièrement d'automatiser des tâches avec des scripts en perl ou en bash. Typiquement voici un exemple de petit script qui va effectuer une syncronisation avec rsync et garder une trace dans un log de tout problèmes éventuel.
Okay, maintenant après quelque mois d'exploitation vous vous retrouverez avec un fichier contenant beaucoup d'informations. Si vous voulez récupérez une partie, et seulement une partie un petit bout de programme perl peut vous être plus utile qu'un simple grep. Dans mon cas j'avais au début de chaque session de rsync j'avais ma ligne avec la date du jour du style :
puis quelque lignes plus bas, le nombre de lignes étant variable d'un jour à l'autre, je me retrouve avec une ligne qui résume les transferts qqch du style :
Ce que je voulais obtenir c'est une liste avec la date du transfert, suivi du nbre de bytes reçus, puis le taux de transfert et à la fin le numéro de la ligne du log pour un contrôle si nécessaire :
Et voici le copde correspondant :
#!/usr/bin/bash
RSYNC="/usr/bin/rsync"
OPTS="-va --stats --partial --partial-dir=tmp --safe-links --no-implied-dirs --timeout=300 --exclude-from=rsync_excluded.txt"
SRC1="rsync://myserver.mydomain.org/mydirectory/"
DST1="mylocal_directory/"
echo "Started update at" `date` >> $0.log 2>&1
logger -t rsync "re-rsyncing witm my remote rsync directory"
${RSYNC} ${OPTS} ${SRC1} ${DST1} >> $0.log 2>&1
echo "End: "`date` >> $0.log 2>&1
Okay, maintenant après quelque mois d'exploitation vous vous retrouverez avec un fichier contenant beaucoup d'informations. Si vous voulez récupérez une partie, et seulement une partie un petit bout de programme perl peut vous être plus utile qu'un simple grep. Dans mon cas j'avais au début de chaque session de rsync j'avais ma ligne avec la date du jour du style :
Started update at Mon Jan 21 08:16:58 2005
puis quelque lignes plus bas, le nombre de lignes étant variable d'un jour à l'autre, je me retrouve avec une ligne qui résume les transferts qqch du style :
sent 20657 bytes received 72055964 bytes 103931.68 bytes/sec
Ce que je voulais obtenir c'est une liste avec la date du transfert, suivi du nbre de bytes reçus, puis le taux de transfert et à la fin le numéro de la ligne du log pour un contrôle si nécessaire :
2005-Jan-21 72'055'964 bytes received 103'931.68 bytes/sec [ 407]
Et voici le copde correspondant :
#!/usr/bin/perl -w
use strict;
my $CurentDate;
my @DateParts;
my $TransferSpeed;
my $BytesSend;
my $BytesReceived;
while (<>) {
if (m/Started update at (.*)/gi) {
@DateParts = split(/ /,$1);
$CurentDate = sprintf("%04s-%03s-%02s",$DateParts[4],$DateParts[1],$DateParts[2]);
}
if (m/\D+(\d+) bytes received (\d+) bytes ([0-9.]+) bytes\/sec/gi) {
$BytesSend = PrintStringWithThousandSeparator($1);
$BytesReceived = PrintStringWithThousandSeparator($2); # bytes /1024 = Kbytes
$TransferSpeed = PrintStringWithThousandSeparator($3);
printf("%12s\t%15s bytes received\t%10s bytes/sec\t[%10s]\n", $CurentDate,$BytesReceived,$TransferSpeed,$.);
}
}
sub PrintStringWithThousandSeparator
{
my $Newtext = $_[0];
$Newtext =~ s/(?<=\d)(?=(?:\d\d\d)+(?!\d))/'/g;
return $Newtext;
}
Commentaires