Voici quelques one liner PERL que j'ai mis de coté, afin de me faciliter la vie lorsque j'écris des scripts shell.
Mais tout d'abord, je vais vous présenter les options qui modifient le comportement de l'interpréteur perl et nous permettre d'utiliser celui-ci, comme une commande shell évoluée, pouvant s'intégrer dans les scripts ou remplir simplement des taches complexes.
Il existe un certain nombre d'options qui modifient le comportement de perl en ligne de commandes.
Les principaux flags sont:
-e | execute | execute la commande |
-l | agestion de la fin de ligne | |
-n | looping | parcourre tout le fichier a la mode awk (avec une option BEGIN / END) |
-p | looping plus | |
-i | modification | modifie le fichier directement que l'on traite |
-a | split | passe le fichier en argument @F |
-M | module | permet l'utiisation directe de modules |
L'option -e permet d'executer la ligne passée comme-ci s'était une commande.
exemple:
perl -e "print 3*4"12
Il est possible d'executer plusieures instructions à condition de séparer les lignes soit par des ;, soit en répétant l'option -e.
Il est aussi possible de modifier les variables à condition que celles ci soient référencées.
perl -e "\$a=12; print ++\$a"13
Il est prudent d'qu'utiliser qq(), q() et qx() au lieu de "", '' et ``, afin d'éviter les mauvaises surprises liées azu shell.
L'option -l permet le traitement automatique des fins de ligne.
Utilisée avec les options -n ou -p, elle fait automatiquement un chomp.Elle peut aussi affecter à $\ la valeur passée.
exemple: coupe toutes les lignes au 72eme caractère
perl -lpe 'substr($_, 72) = "" if length > 72'
L'option -n ajoute la boucle suivante autour de votre code :
LINE: while (<>) { ... # votre programme ici }
Cela revient à utiliser Perl un peu à la manière de awk.
L'option -p ajoute la boucle suivante, qui imprime automatiquement les lignes, autour de votre code
LINE: while (<>) { ... # votre programme ici } continue { print or die "-p destination: $!\n"; } }
L'option -i vous permet de modifier directement le fichier que vous êtes en train de traiter.
L'option -a ajoute un split() dans la boucle implicite créée par -n ou -p. Le résultat du split est stocké dans le tableau @F, ce qui permet de manipuler des colonnes. Pour mémo, split sans argument est exactement équivalent à split(/\s+/, $_, 0). L'option -F permet de définir un autre motif quand elle est utilisée avec -a.
exemple: addition des 2 premières colonnes d'un fichier
perl -lane 'print $F[0] + $F[-1]' fichier24 April 2014
affichage de la première colonne
perl -lane 'print shift @F' fichier
affichage des colonnes 4 et 5
perl -lane 'print $F[4] $F[5]' fichier
Les options -M et -m vous permettent d'utiliser des modules.
exemple:
perl -MPOSIX=strftime -e 'print strftime("%d %B %Y", localtime)'24 April 2014
Cette fois on a des exemples concrets d'utilisation utile de perl.
perl -lne 'END { print $. }' smit.log 38ou
perl -le 'print $n=()=<>' smit.log
perl -ne 'print if 10..15'
$ perl -pe 's/\bmot\b/par/g' fichier > fichier2
perl -le 'print map { ("a".."z")[rand 26] } 1..8'
générer un mot de passe plus compliqué
perl -le 'print map { ("a".."z", 0..9,"A".."Z")[rand 60] } 1..8'
perl -le 'print "="x60'
perl -le 'print "#"."="x50'
#perl -le '@list = ("bob","john","jane")x5; print "@list"'bob john jane bob john jane bob john jane bob john jane bob john jane
perl -le 'print time' 1398331554
perl -le 'print scalar gmtime' Thu Apr 24 09:27:12 2014perl -le 'print scalar localtime'
perl -MPOSIX -le '@now = localtime; $now[3] -= 1; print scalar localtime mktime @now'
echo 1398331554 | perl -ne 'print scalar gmtime," ",$_' Thu Apr 24 09:38:22 2014 1398331554ou
echo 1398331554 | perl -ne 'print scalar localtime," ",$_'
perl -Mbignum=PI -le 'print PI*2' 6.283185307179586476925286766559005768394
perl -le '$n = 20; $m = 35; ($m,$n) = ($n,$m%$n) while $n; print $m'
perl -le 'for (1..10) { printf "$_ " }' 1 2 3 4 5 6 7 8 9 10Ceci affiche en vertical, si vous souhaitez avoir tout en ligne:
perl -le 'for (1..10) { printf "$_ " }' 1 2 3 4 5 6 7 8 9 10
perl -le '$n=10; $min=1; $max=20; $, = " "; print map { int(rand(> 1 1 5 19 19 1 10 16 12 15 perl -le '$n=10; $min=1; $max=20; $, = " "; print map { int(rand($max-$min))+$min } 1..$n' 19 18 11 9 12 4 12 12 3 17
perl -l -Mbignum -e'print $bignum::VERSION'0.17