Parcours
/
AWK
AWK
/
Programme
/
Fondamentaux
Fo

Fondamentaux en AWK

1 exercice

À propos de Fondamentaux

On appellera le langage AWK et l'exécutable qui interprète les programmes AWK awk ou gawk.

Motifs et actions

Un programme AWK est composé de paires motif-action

pattern1 { action1 }
pattern2 { action2 }
...

Un motif peut être une expression régulière à comparer à l'entrée. Il peut aussi s'agir de n'importe quelle expression qui donne une valeur vrai/faux.

Une action est une ou plusieurs commandes AWK. Les accolades qui l'entourent sont obligatoires.

Si le résultat du motif est vrai, alors l'action correspondante est évaluée.

Enregistrements et champs

AWK analyse l'entrée comme une suite d'enregistrements. Chaque enregistrement est découpé en zéro ou plusieurs champs.

Le comportement par défaut est le suivant :

  • découper l'entrée en enregistrements en utilisant le retour à la ligne comme « séparateur d'enregistrements », de sorte que chaque ligne est un enregistrement.
  • découper l'enregistrement en champs en utilisant les espaces comme « séparateur de champs », de sorte que chaque mot est un champ.

Motifs et actions, suite

On peut omettre le motif, auquel cas l'action est évaluée pour chaque enregistrement en entrée.

On peut omettre l'action, auquel cas l'action par défaut est d'afficher l'enregistrement courant.

Motifs spéciaux

Il existe deux motifs spéciaux souvent utilisés.

  • BEGIN évalue l'action associée avant que la moindre entrée ne soit consommée.
  • END évalue l'action associée une fois toute l'entrée consommée.

Variables de champ

On désigne les champs par $1, $2, $3, etc.

L'enregistrement courant est $0.

Caution

Pour être précis, ce ne sont pas à proprement parler des « variables ». Le $ peut être vu comme un opérateur qui récupère la valeur du numéro de champ indiqué. On reviendra plus en détail là-dessus dans les concepts à venir.

Voici quelques autres variables intégrées fréquemment utilisées.

Variables intégrées qui contrôlent l'analyse de l'entrée

  • RS est le séparateur d'enregistrements en entrée. Comme on l'a mentionné, sa valeur par défaut est le retour à la ligne.
  • FS est le séparateur de champs en entrée.

Ces variables sont souvent définies dans le bloc d'action BEGIN.

Variables intégrées qui portent des informations

Ces variables sont définies automatiquement par AWK pendant l'exécution du programme.

  • NF stocke le nombre de champs de l'enregistrement courant.
    • Pour obtenir la valeur du dernier champ, utilise $NF.
  • NR stocke le numéro de l'enregistrement courant.
    • Quand plusieurs fichiers d'entrée sont traités, NR contient le nombre total d'enregistrements traités jusqu'ici.
  • FNR stocke le numéro de l'enregistrement courant dans le fichier d'entrée courant.
    • Pour illustrer la différence entre NR et FNR, voici une expression AWK courante.
      NR == FNR {action}
      
      Cela signifie « si le nombre d'enregistrements accumulé est égal au numéro de l'enregistrement dans le fichier courant ». Cela ne peut être vrai que pour les enregistrements du premier fichier d'entrée.

La notion de vérité

AWK utilise la même notion de vérité que C :

  • Le nombre 0 est faux.
  • Tout autre nombre est vrai.

Comme AWK est un langage de traitement de texte, les valeurs de vérité s'étendent aussi aux strings.

  • Une string vide "" est fausse.
  • Toute string non vide est vraie.
Note

AWK utilise la même notion de vérité que C

AWK est né aux Bell Labs dans les années 1970, dans le même environnement où C a été inventé. C a eu une grande influence sur la syntaxe d'AWK.

Caution

Une bizarrerie à garder en tête

  • Le nombre 0 est faux.
  • La string non vide "0" est vraie !

On approfondira les types de données d'AWK dans les concepts suivants.

Commentaires

Les commentaires commencent par le caractère # et vont jusqu'à la fin de la ligne.

Comment fournir une entrée à awk

awk peut lire son entrée depuis des fichiers ou depuis l'entrée standard. Chacune de ces techniques fonctionne.

awk '/regex/ {print $1}' file1 file2 ...

awk '/regex/ {print $1}' < file

some_command_here | awk '/regex/ {print $1}'

Exemples

Sur les systèmes de type Unix, /etc/passwd contient des informations sur les utilisateurs. Chaque utilisateur est décrit sur une ligne distincte, avec des champs séparés par des deux-points.

Pour lister les noms d'utilisateur :

awk '
    BEGIN { FS = ":" }
    { print $1 }
' /etc/passwd

Note que l'action {print $1} n'a pas de motif, elle est donc exécutée pour chaque enregistrement.

Si on veut limiter la sortie aux seuls utilisateurs qui utilisent bash comme shell de connexion, on peut faire :

awk '
    BEGIN { FS = ":" }
    $7 == "/bin/bash" { print $1 }
' /etc/passwd

Quelques autres exemples

Voici quelques programmes awk qui produisent les mêmes résultats que d'autres commandes Unix courantes.

  • Afficher un fichier

    cat file.txt
    
    awk '1' file.txt
    
  • Rechercher des motifs dans un fichier

    grep 'foo.*bar' file.txt
    
    awk '/foo.*bar/' file.txt
    
  • Afficher seulement quelques lignes au début d'un fichier

    head -n 20 file.txt
    
    awk '
        1
        NR == 20 {exit}
    ' file.txt
    
  • Remplacer du texte dans un fichier

    sed 's/foo/bar/' file.txt
    
    awk '{sub(/foo/, "bar")};1' file.txt
    # or more readably
    awk '
        {
            sub(/foo/, "bar")
            print
        }
    ' file.txt
    
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Fondamentaux