Introduction à l'utilitaire (g)awk


Sources

  • Linux (in a nutshell) O'Reilly éditeur (chapitre 11)
  • le manuel en ligne : man gawk

    Fonctionnalités et origine

    Introduction par l'exemple

    Voici un mini-tutoriel qu'il est conseillé d'expérimenter.
    Il utilise le fichier /etc/passwd supposé bien connu.
    Son format de ligne est : login:x:uid:gid:commentaire:home:shell
    1. Voici une syntaxe simplifiée : gawk -F":" 'bloc-programme' /etc/passwd
      • L'option -F":" signale que le caractère séparateur est ":" dans ce fichier.
      • Le bloc-programme, entouré de {} s'appliquera à chaque ligne. Il contient souvent print, l'instruction d'affichage sur la sortie standard, et des chaines constantes entourées de " ".
        A noter que print, seul, affiche toute la ligne et insère un retour-chariot.
      • Par exemple la commande :
        gawk -F":" '{print "Ligne n° " NR "=" $0}' /etc/passwd
        affiche les lignes (référencées par la variable système $0), précédées de leur numéro (contenu dans NR)
      Comparer avec gawk -F":" '{print}' /etc/passwd

    2. Chacune des lignes est découpée par gawk suivant ":" en 7 champs, dont les valeurs individuelles sont affectées aux variables système $1, $2 ... jusqu'au dernier.
      Par exemple, soit la commande :
      gawk -F":" '{print "Le répertoire personnel de " $1 " est " $6}' /etc/passwd
      appliquée à la ligne particulière toto:x:520:521:Monsieur Toto Jules:/home/toto:/bin/bash, elle fera afficher :
      Le répertoire personnel de toto est /home/toto

    3. gawk -F":" '{print "Le nombre de champs = " NF " et le dernier vaut " $NF }' /etc/passwd
      Cette commande affiche le nombre de champs pour chaque ligne et la valeur du dernier.
      Ce nombre de champs est contenu dans la variable prédéfinie NF, ici 7, et la valeur du dernier champ peut alors être référencée par $NF

    4. gawk -F":" '{print "Premier champ : "$1 " ; print "Et dernier : $NF }' /etc/passwd
      Bien noter que le bloc d'instruction (appelé souvent le bloc "action") est entouré d'accolades, et que le point-virgule est le séparateur d'instructions. Dans l'exemple, à comparer au précédent, chaque print fait passer à la ligne.

    5. gawk -F":" '{ if ($3 >= 500 ) print "login " $1 " uid = " $3 " rép perso : " $6}' /etc/passwd
      Les utilisateurs créés par root ont un numéro, leur uid, attribué à partir de 500.
      La commande permet de sélectionner ces utilisateurs et d'afficher leur login, leur uid et leur répertoire personnel.
      Exercice d'application
      Sélectionner les utilisateurs précédents, extraire leur login et leur nom complet (normalement 5ème champ $5), les trier par ordre alphabétique et les stocker dans le fichier users.txt

    6. Dans l'exemple précédent, la sélection est effectuée par une expression relationnelle, autrement dit une comparaison
      Les opérateurs de comparaison usuels peuvent s'appliquer (attention : l'égalité s'exprime avec ==, la différence avec !=) ainsi que les opérateurs booléens : && (et), || (ou) , ! (non)
      Par exemple la commande :
      gawk -F":" '{ if ($3 >= 500 && substr( $1, 0, 1)== "j") print NR "login " $1 " uid = " $3 " rép perso : " $6}' /etc/passwd
      Elle extrait les comptes d'uid supérieurs à 500 (grâce à $3>=500) et commençant par la lettre "j". En effet, l'appel à la fonction prédéfinie substr( $1, 0, 1) extrait une sous-chaine du nom ($1) à partir du 1er caractère (numéro 0) et sur une longueur 1, autrement dit l'initiale du nom.

    7. On peut aussi sélectionner les enregistrements d'un fichier grâce à une expression rationnelle (ou régulière)
      Par exemple la commande :
      gawk -F":" ' $1 ~/^[a-fj]/ { print NR $0 }' /etc/passwd
      sélectionne les lignes commençant par une lettre appartenant à l'intervalle de a à f, ou par j, et les affiche avec leur numéro de ligne. Attention ! l'opérateur [..] applique un OU implicite entre les lettres qu'il contient.

      ... La suite, prochainement ...