On appellera le langage AWK et l'exécutable qui interprète les programmes AWK awk ou gawk.
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.
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 :
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.
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.On désigne les champs par $1, $2, $3, etc.
L'enregistrement courant est $0.
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.
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.
Ces variables sont définies automatiquement par AWK pendant l'exécution du programme.
NF stocke le nombre de champs de l'enregistrement courant.
$NF.NR stocke le numéro de l'enregistrement courant.
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.
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.AWK utilise la même notion de vérité que C :
0 est faux.Comme AWK est un langage de traitement de texte, les valeurs de vérité s'étendent aussi aux strings.
"" est fausse.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.
Une bizarrerie à garder en tête
0 est faux."0" est vraie !On approfondira les types de données d'AWK dans les concepts suivants.
Les commentaires commencent par le caractère # et vont jusqu'à la fin de la ligne.
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}'
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
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