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.

#!/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

Posts les plus consultés de ce blog

Comment extraire les fichiers disques en raw d'un backup proxmox vma

Find the lists of disks of your Proxmox VM stored in a ceph cluster

Comment copier une machine virtuelle kvm en raw sur un Volume Group LVM2 se trouvant sur un disque en DRBD