one liner en PERL

Creation: 24 avril 2014
Mise à jour:
Version: 1.0
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2014 Jean-Louis BICQUELET-SALAUN

one liner PERL

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.

utilisation de perl en ligne de commande

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

execute

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.

gestion de fin de ligne

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' 

looping

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.

looping plus

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";
   }
   } 
 

modification

L'option -i vous permet de modifier directement le fichier que vous êtes en train de traiter.

split

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 

modules

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
 

one liner utiles

Cette fois on a des exemples concrets d'utilisation utile de perl.

fichiers

  1. compter le nombre de ligne d'un fichier
    perl -lne 'END { print $. }' smit.log
    38
     
    ou
    perl -le 'print $n=()=<>' smit.log
     
  2. afficher les lignes d'un fichier de 10 à 15
    perl -ne 'print if 10..15'
     
  3. remplacer une chaine
    $ perl -pe 's/\bmot\b/par/g' fichier > fichier2
     

texte

  1. générer un mot de passe simple

    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'
     
  2. afficher une ligne de n fois le meme caractère
    perl -le 'print "="x60'
     
  3. afficher une ligne de commentaire de séparation
    perl -le 'print "#"."="x50'
     
  4. comment générer une liste répétée d'éléments
    #perl -le '@list = ("bob","john","jane")x5; print "@list"'bob john jane bob john jane bob john jane bob john jane bob john jane
     

temps

  1. comment afficher le teps en seconde depuis le premier janvier 1970 ?
    perl -le 'print time'
    1398331554
     
  2. comment afficher l'heure GMT (Greenwich Mean Time) ?
    perl -le 'print scalar gmtime'
    Thu Apr 24 09:27:12 2014
    

    perl -le 'print scalar localtime'

  3. comment afficher la date d'hier ?
    perl -MPOSIX -le '@now = localtime; $now[3] -= 1; print scalar localtime mktime @now'
     
  4. comment afficher la date correspondant à un timestamp ?
    echo 1398331554  | perl -ne 'print scalar gmtime," ",$_'
    Thu Apr 24 09:38:22 2014 1398331554
     
    ou
    echo 1398331554 |  perl -ne 'print scalar localtime," ",$_'
     

math

  1. comment utiliser PI?
    perl -Mbignum=PI -le 'print PI*2'
    6.283185307179586476925286766559005768394
     
  2. comment trouver le plus grand commun diviseur (PGCD) de deux nombres?
    perl -le '$n = 20; $m = 35; ($m,$n) = ($n,$m%$n) while $n; print $m'
     

divers

  1. comment afficher une boucle de 1 à 10 ?
    perl -le 'for (1..10) { printf "$_ " }'
    1 2 3 4 5 6 7 8 9 10 
     
    Ceci 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 
     
  2. comment générer 10 tirages d'un dé 20 ?
    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
    

  3. comment obtenir la version d'un module ?
    perl -l -Mbignum -e'print $bignum::VERSION'0.17