Perl "OneLiner"

Perl a ceci de merveilleux qu'il peut être utilisé comme un formidable outil d'expérimentation.
Avec un simple switch "-e" on peut partir à l'aventure :
perl -e "print qq(Coucou le hibou)"
Coucou le hibou

Ainsi voici un chtit Search & Replace bien pratique sur le contenu d'un fichier:
perl -pe 's/oldstring_re/newstring/gi ' MyFile.txt

On verse dans le délire intégral ? Ok alors on a un fichier log d'un serveur web, qqch du style :
2003-02-06 06:34:41 10.18.15.9 SUISSE_VS\assa0018 W3SVC3 10.180.7.40 80 GET /goeland/parc/xml/CityWithParcelle.xml - 304 0 141 602 15
2003-02-06 06:34:41 10.13.21.4 SUISSE_VS\cmrs0062 W3SVC3 10.180.7.40 80 GET /goeland/parc/xsl/CGComboCityWithParcelle.xsl - 304 0 141 368 0
2003-02-06 06:34:43 10.18.15.42 SUISSE_VS\rsta0015 W3SVC3 10.180.7.40 80 POST /goeland/parc/xml/CNGetDataParcelle.asp - 200 0 89 739 922
2003-02-06 06:34:43 10.12.2.49 SUISSE_VS\rsta0015 W3SVC3 10.180.7.40 80 GET /groeland/parcelle/xsl/CNDataParcelle.xsl - 304 0 140 358 0
En quatrième position et séparé par des espaces on a un nom de login, on veut obtenir une liste ordonnée de ces logins avec leur nombre de hits, soit le nombre de fois que l'on a trouvé des lignes dans le fichier log pour cet utilisateur. Et bien en une ligne avec du Perl ça donne :
perl -ne "if (m/^[^# ]([^ ]+)\s([^ ]+)\s([^ ]+)\s([^ ]+)/gi) { $tmp=qq(\U$4); %MyHash =(%MyHash,$tmp, $MyHash{ $tmp }+1); } END{foreach $key (sort keys %MyHash) {print qq($key => $MyHash{$key}\n);}}" ./ex030208.log
Et on obtient quelquechose du style :
SUISSE_VS\assa6018 => 32
SUISSE_VS\cmrs0062 => 160
etc...

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