Articles

Affichage des articles associés au libellé perl

Comment ajouter des sauts (retour) à la ligne dans un énorme xml d'une seule ligne !

J'avais un grand fichier récupéré via un curl : curl -#v -o /tmp/output.xml "http://www.myserver.ch/extraction_file.php?mode=complex&typef=xml" le problème c'est que ce fichier "output.xml" était un gros xml valide d'une seule  ligne... un "wc -l /tmp/output.xml"  me retourne bien 1 ! Or la plupart des éditeurs n'aiment pas trop ouvrir ce genre de fichier d'une seule "énorme" ligne, voire même ils plantent lamentablement. La solution est d'utiliser un bon vieux oneliner en perl pour rajouter un saut de ligne après un tag fermant : perl -i -pe 's/<\/Adr>/<\/Adr>\n/g' /tmp/output.xml Et voilà , maintenant le fichier contient autant de ligne qu'il y a de tags fermants . Et du coup il est beaucoup plus facile à utiliser dans votre éditeur favori !

Download du snapshoot de chromium

Image
Si vous êtes comme moi, vous aimez avoir   chromium sur votre distribution Linux favorite. Pers Personnellement rien que pour la syncro automatique des favoris et pour pouvoir tester webgl, j'avoue que je ne pourrais plus me passer de chromium. Pour avoir toujours la dernière version j'ai écrit ce petit script perl getchromium.pl Maintenant en lançant getchromium.pl sur ma Ubuntu j'obtiens la dernière archive pour Linux x86_64 qui va se décompresser dans le répertoire du nom de cette release et créer un lien symbolique sur ce répertoire. Comme j'ai créé sur mon bureau Gnome un lanceur qui pointe sur ~/tools/chromium/chrome-linux/chrome --enable-webgl je peux donc toujours lancer la dernière snapshoot de chromium x86_64 disponible sur le buildbot chromium.

Sur la coloration syntaxique dans Vim sur Debian

Je travaille en ce moment sur la configuration d'un serveur ProxMox. Cette distribution permet de mettre en oeuvre un serveur de virtualisation assez rapidement en s'appuyant sur une debian 64 bit et sur les outils kvm que j'utilise déjà depuis un bon bout de temps sur Gentoo et OpenVz (une solution de virtualisation "container" pour Linux que je découvre), il faudra d'ailleurs que je fasse un post rien que sur ça. En attendant je vous livre l'url publique de mon blocnotes sur la virtualisation Bref toujours est-il que dans mon envirronement réseau je suis dérrière un Proxy et qu'il a fallu que je fasse 2-3 modifs pour que tout cela fonctionne. Et comme ProxMox utilise les modules PVE en perl et que j'en avais marre de voir le code Perl dans /usr/share/perl5/PVE/ en Noir et Blanc avec vim je voulais activer la coloration syntaxique en faisant un syntax enable en mode commande dans Vim et je me vois répondre que c'est Nicht Supportieren dans c...

Extraire tous les textes de liens dans un tag

Soit une page html contenant une liste de fichiers du style de ce que l'on trouve dans une page d'index générée par le serveur Apache. Je veux en extraire tous les noms de fichiers. Donc en résumé j'ai quelque chose du style : <img src="compressed.gif" alt="[ ]" height="22" width="20"> <a href="http://mirror.switch.ch/ftp/mirror/gentoo/distfiles/zsh-lovers_0.5.orig.tar.gz">zsh-lovers_0.5.orig.tar.gz</a> 01-Aug-2006 18:05 487K <img src="unknown.gif" alt="[ ]" height="22" width="20"> <a href="http://mirror.switch.ch/ftp/mirror/gentoo/distfiles/zsnes151src.tar.bz2">zsnes151src.tar.bz2</a> 25-Jan-2007 02:22 1.0M <img src="compressed.gif" alt="[ ]" height="22" width="20"> <a href="http://mirror.switch.ch/ftp/mirror/gentoo/distfiles/zssh-1.5a.tgz">zssh-1.5a.tgz</a> 2...

Comment extraire une "zone" de texte

Il arrive qu'on aie besoin de sortir tout ce qu'il y a en tre blabla et blabli et bien en perl on peut utiliser lkes ranges avec l'opérateur '..'. Ainsi avec perl -ne 'print if /<title.*>/../<\/title>;/' index.html On obtient uniquement le titre de la page Bien sur rien n'empêche d'utiliser l'excellent LWP pour récupérer la page perl -MLWP::Simple -e 'getprint q(http://lapt.blogspot.com)'

Analyse de fichiers Log en perl

Quand il faut analyser de grandes quantité de données sous format texte tel que des fichiers logs, Perl est d'une aide inappréciable. Voici un joli "perl oneliner" qui va calculer le nombre de hits par user login dans un log IIS perl -ne 'unless (/^#.*$/) {@e=split(/ /,$_); $Login{uc($e[8])}++;} END{foreach $key (sort keys %Login){printf(qq(%-25s %i\n),$key,$Login{$key}); } }' 2007/ex070106.log 2007/ex070107.log |sort -k 2nr >DistinctsLogins200701.txt Analysons un peu cette ligne de commande: perl -ne : on lance perl avec les option -n qui rajoute une boucle while ( ) {...} implicite et l'option -e qui permet justement d'exécuter une commande cf doc perl en ligne 'unless (/^#.*$/) { : viens maintenant le début du programme perl, en l'occurrence on dit que tant qu'on est pas dans une ligne de commentaire on va faire quelque chose se trouvant après l'accolade ouvrante. En effet dans les fichiers logs une ligne commentaire commence p...

Downloader un fichier sur le net sous Win32

Il est parfois nécessaire de récupérer un ou plusieurs fichiers sur le net en ligne de commande sous Microsoft. Pour cela il suffit d'utiliser l'excellent curl compilé pour cette plateforme. Ensuite de quoi il faut penser à utiliser un utilisateur null avec l'option -u ":" . Ainsi cela force curl à utiliser les credentials du compte courant, c'est à dire le user qui est connecté. Chez moi au final cela donne curl --anyauth -u ":" -x "" --netrc http://www.test.com/logs/ l'option -x "" annule une evt variable d'environnement définissant un proxy, elle est utile par exemple quand vous ne voulez pas utilisez le proxy parceque votre serveur est dans votre réseau local (et pas sur internet) A vous de voir si vous en avez besoin ou pas selon les cas.

Trouver la date de hier en Perl

Pour récupérer la date de hier en Perl, toujours en une ligne: perl -e '($d,$m,$y)= (localtime)[3..5];printf("%04d-%02d-%02d",$y+1900 ,$m+1,$d-1)' retournera : 2007-07-09 S'il s'agit de conserver cette chaine pour par exemple downloader un fichier log il suffit d'utiliser sprintf #!/usr/bin/perl ($d,$m,$y)= (localtime)[3..5]; $yesterday=sprintf("%04d-%02d-%02d",$y+1900 ,$m+1,$d-1); print $yesterday;

Récuperer tous les hyperliens d'une page web

c'est trop beau pour pas le signaler, en une ligne afficher la liste de tous les hyperliens sur une page web curl --anyauth --netrc http://yourweb/yourpage.htm |perl -ne 'while (m/HREF=["]([^"]+)/gi) {print "$1\n";} '

Comment ajouter un séparateur de millier (en 1line)

c'est trop beau, c'est du perl et c'est en une seule ligne : perl -pi.original -e "s/(? ))/'/g unless /2006/" default.html et avec ça tous les chiffres du fichier html passé en paramètre vont recevoir un joli séparateur de milliers. Et ne plus on a une copie de sécurité qui se crée au cas zou... Ainsi j'avais des lignes du style : <FONT SIZE="-1">644303595217</FONT> qui deviennent <FONT SIZE="-1">644'303'595'217</FONT> c'est juste pur , c'est juste du perl !

Modifer une variable dans n fichiers de configs INI

Hier, j'ai finalisé la config d'un serveur de secours Linux Opteron pour notre guichet cartographique. Il s'appuye sur l'excellent produit Mapserver ainsi que sur le non moins excellent framework php Cartoweb de CamptoCamp ! J'utilise rsync pour la synchronisation et j'ai été confronté à un chtit problème, sur mon deuxième serveur au vu des versions de apache et php que j'avais utilisé il me fallait charger la dll php_mapscript.so au niveau du php.ini. Du coup il me fallait modifier tous les sites cartographiques de mon serveur au niveau d'un fichier de config nommé server.ini. Je devais modifier dans tous ces fichiers la valeur d'une variable nommée disablePHPModuleCheck, est la passer de false à true. Donc en résumé j'avais n fichiers server.ini à chercher dans une arborescence complexe démarrant dans "/data/dataweb/web/" puis il me fallait éditer chacun de ces fichiers pour passer la valeur de la variable " disablePHPModuleC...

Trouver des fichiers contenant une regular expression

L'autre jour je devais parcourir toute une arborescence de fichiers pour trouver tous les fichiers de type CSS ayant un style utilisant l'attribut url("cheminrelatif/fichierimage.png") et ou il manquait le premier guillemet. Avec la combinaison des commandes find,egrep et surtout xargs j'ai pu trouver les fichiers en question tout de suite : find . -name '*.css' |xargs egrep -lr 'url\([^"]+"\)'

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 ...

Obtenir la liste des paquetages "ebuilds" sous Gentoo

Image
Quand on utilise la distribution Gentoo sur plusieurs serveurs comme c'est le cas en ce qui me concerne, il peut être intéressant de retrouver rapidement la liste des paquetages wue l'on emerger par le passé. Bien sur certain dirons qu'il suffit de regarder le contenu du "world" et faire un : less /var/lib/portage/world pour voir la liste des paquetages installé expressement sur cette machine... Sauf que bien souvent on aimerait bien avoir un peu plus d'informations, c'est pour cela que j'utilise les outils du paquetage gentoolkit notamment l'utilitaire qpkg qui permet d'obtenir des informations sur un paquetages précis. Donc vous pouvez installer le paquetage gentoolkit avec un : emerge -v gentoolkit puis ensuite vous puvez voir tout ce qui a été installé en lançant un : equery f gentoolkit ce qui va vous lister les fichiers contenus dans le paquetage en question. Comme le but de toute l'opération était de pouvoir ressortir plus d'on...

Perl : Comment afficher des "gros" chiffres avec un séparateur de milliers ?

Hummm quand il s'agit de lire des très grand chifres à l'écran, il n'est pas très pratique de devoir compter à la main sur l'écran les groupes de milliers... Et donc un séprateur de millier prend tout son sens : 1'456'987 est plus lisible que 1456987 ! c'est ainsi que Perl devient votre petit à petit votre alié quotidien. Car à l'aide des expressions régulières et de l'opérateur de substitution il est très facile d'obtenir l'effet escompté en 3 lignes ! En éxécutant le code ci-dessous on obtient . My personal fortune is 1'234'567 US$ #!/usr/bin/perl -w use strict; my $test = "My personal fortune is 1234567 US\$"; print PrintStringWithThousandSeparator($test); sub PrintStringWithThousandSeparator { my $Newtext = $_[0]; $Newtext =~ s/(? return $Newtext; }

Un peu de graphismes avec Perl::Tk !

Avec perl on peut afficher des fenêtres avec le module Tk. En fait dans le Linux Magazine de Mai 2004 il y a un chouette article "Using Perl/Tk for Simple Graphing" avec un exemple de code perl qui permet de récupérer via un pipe le Uptime d'un serveur distant (avec ssh) et de l'afficher dans une jolie fenêtre tk, on peut récupérer le code perl #!/usr/bin/perl -w $ProgramToTrack = $ARGV[0] || "bash"; print "Perl process tracker\n"; print "About to track : $ProgramToTrack\n"; $val = `pidof $ProgramToTrack`; chomp($val); #print 'DEBUG - $val =' . . "\n"; @ListOfPid = split(/ /,$val); print "Found those entries :\n"; foreach $ThePid (@ListOfPid){ $TheStats=""; open(PSTAT,"/proc/$ThePid/stat"); while ( ) { $TheStats .= $_ } chomp($TheStats); print "$ThePid : $TheStats\n"; close(PSTAT); };

Quels RPMs surmon bô serveur

Et voici un petits shells scripts tout con, que j'ai écrit parceque je voulais savoir rapidement ce qui se trouvait sur mon serveur, il permet de savoir les RPM qui sont déjà installés, mais surtout de lire leurs description sans devoir se casser la tête. On peut sauver le fichier sous un nom évoquateur tel que listerpm.sh et ensuite on peut l'appeller soit tel quel sans arguments et alors il donnera l'intégrale des rpm présents sur le serveur, soit on lui passe un argument du style "./listerpm.sh open" et dans ce cas il ne listera que les paquetages rpm contenant dans leurs nom "open" en majuscules ou en minuscules (switch -i du grep)... #!/bin/sh if [ -z "$1" ]; then rpm -qa |sort |perl -ne 'print qx(rpm -qi $_).qq(\n).q(*)x80 . qq(\n);'| more else rpm -qa |grep -i $1 |sort |perl -ne 'print qx(rpm -qi $_).qq(\n).q(*)x80 . qq(\n);'| more fi En éspérant que cela soit utile, et/ou que cela vous inspire pour un autre usage !

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 /g...