truc PERL pour shell

Creation: 30 septembre 2006
Mise à jour: 11 decembre 2014
Version: 1.1
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2006-2014 Jean-Louis BICQUELET-SALAÜN

trucs PERL pour le shell

manipulation de fichiers

Il arrive que l'on se sente un peu à l'étroit avec le shell. Voici quelques exemples de commandes PERL que l'on peut insérer dans un script shell afin de se faciliter la vie.
  1. Voila une façon d'extraire des données d'un fichier. La commande qui suit extraire la documentation pod d'un fichier.

    #perl -ne 'print if /^=pod/ .. /^=cut/' test.pl 
    

    Il est possible de remplacer if par @b/unless@b pour exclure les ligne comprises entre les deux délimiteurs. On peut tout autant remplacer la recherche de la chaine par des numéros de lignes. Pour supprimer les lignes 10 à 12 il faut taper:

    #perl -ne 'print unless 10 .. 12' 
    

  2. Pour extraire la première colonne d'un tableau:

    #perl -lane 'print $F[0] ' e.csv
    

    Attention, la première colonne commence à l'indice 0, la seconde est 1 et ainsi de suite.

  3. comment faire un dé à 6 chiffres ou tirer un pourcentage

    #perl -e "print int(rand(6))+1"
    #perl -e "print int(rand(101))"
    

  4. On peut utiliser PERL pour remplacer une valeur dans un fichier.

    #perl -p -i.bak -e 's/toto/tata/g' test.txt
    

    L'option -i.bak va créer un fichier @i/ test.txt.bak @i.

    Vous pouvez aussi modifier plusieurs fichiers d'un coup en utilisant les jokers (*.txt par exemple). Vous pouvez utiliser des expression comme par exemple \btoto\b pour rechercher le mot toto seul. L'option @b--i) peut aussi s'utiliser avec les commandes d'extraction. Conserver la première ligne d'un fichier revient à écrire:

    #perl -i.bak -ne -i 'print if 1 .. 1'
    

une aide au shell

    On faire des calculs complexes en ligne de commande:

    #perl -e 'print 34+56,  "\n"'
    #perl -e 'print sqrt(16)'
    #x=234
    #perl -e "print sqrt($x)"
    15.2970585407784
    #perl -e 'print sqrt($x)'
    

    On peut utiliser une variable. comme dans l'exemple. Il faut que x soit fixé par le shell.

  1. On peut facilemet faire une boucle for à inserer dans un script shell, soit avec une syntaxe de type c, soit avec une syntaxe plus proche de Perl.

    #perl -e 'for ($i = 0; $i < 10; $i++) { print $i," " }; '
    0 1 2 3 4 5 6 7 8 9 
    
    #perl -e 'for (1..10) { print $_," " }; '
    1 2 3 4 5 6 7 8 9 10
    
    #for i in $(perl -e 'for (0..5) { print $_," " };)
    do
      lscfg -vl hdisk$i
      done
    

    Le dernier exemple montre comment on utilise Perl pour lister la configuration des 6 permiers disques du système.

  2. On peut aussi plus facilement manipuler les chaines de caractères (comme awk peut le faire) dans un script shell.

    #a="essai"
    #perl -e  "print substr($a,0,3)"
    ess
    
    #a=azerty
    #perl -e  " print length($a)"
    6
    

  3. PERL peut aider à convertir les timestamp Unix (temps en seconde depuis 1970) en date compréhensible par un humain.

    a=`perl -e "use Time::Local;print timelocal(0,10,9,13,8,2006);"`
    

    ordre seconde minute heure jour mois -1 (attention!) annee dans l'autre sens:

    #perl -e "use Time::Local;print scalar localtime($a);"
    

systeme

  1. On peut récupérer le hostname de la machine à partir de Perl même si la fonction uname est plus commode.

    #perl -M'Sys::Hostname' -e 'print  hostname(), "\n"'