La commande AWK est un outil puissant et polyvalent qui permet de traiter et de transformer des données textuelles sous Linux. Que ce soit pour extraire des informations, filtrer des lignes, reformater des sorties ou effectuer des calculs, AWK peut vous simplifier la vie en quelques lignes de code. Dans cet article, vous allez découvrir comment utiliser la commande AWK pour la manipulation de texte sous Linux.
Qu’est-ce que la commande AWK ?
La commande AWK est un langage de programmation interprété qui s’exécute dans le terminal Linux. Son nom vient des initiales de ses créateurs : Alfred Aho, Peter Weinberger et Brian Kernighan. AWK a été conçu à l’origine pour traiter des fichiers structurés en champs séparés par des délimiteurs, comme les fichiers CSV ou les fichiers /etc/passwd. Mais AWK peut aussi manipuler des fichiers texte plus complexes, comme des fichiers HTML ou XML. AWK n’est pas un langage de programmation orientée objet, mais il permet de définir des fonctions et des variables locales ou globales. Il dispose aussi de structures de contrôle comme les boucles et les conditions.
La syntaxe générale de la commande AWK est la suivante :
awk [options] 'program' [fichiers]
Le program
est une suite d’instructions qui définissent des motifs à rechercher dans chaque ligne du ou des fichiers
et des actions à effectuer lorsqu’un motif est trouvé. Les options
permettent de modifier le comportement de la commande AWK, comme le choix du délimiteur de champ ou le format de sortie.
Comment imprimer du texte avec la commande AWK ?
La commande AWK peut être utilisée pour imprimer un message sur le terminal en fonction d’un motif dans le texte. Si vous exécutez la commande AWK sans aucun motif et juste une commande d’impression, AWK imprime le message chaque fois que vous appuyez sur Entrée.
Par exemple, si vous tapez :
awk '{print "Bonjour"}'
Et que vous appuyez sur Entrée plusieurs fois, vous obtenez :
Bonjour
Bonjour
Bonjour
Pour arrêter la commande AWK, vous pouvez appuyer sur Ctrl+C.
Si vous voulez imprimer le contenu d’un fichier avec la commande AWK, vous pouvez utiliser le motif spécial BEGIN
, qui s’exécute avant de lire le fichier, et le motif spécial END
, qui s’exécute après avoir lu le fichier. Par exemple, si vous avez un fichier nommé test.txt
qui contient :
Ceci est un test
AWK est un outil formidable
Linux est le meilleur système d'exploitation
Vous pouvez imprimer le contenu du fichier avec la commande suivante :
awk 'BEGIN {print "Voici le contenu du fichier test.txt :"} {print} END {print "Fin du fichier"}' test.txt
Ce qui donne :
Voici le contenu du fichier test.txt :
Ceci est un test
AWK est un outil formidable
Linux est le meilleur système d'exploitation
Fin du fichier
La commande {print}
sans argument imprime la ligne entière. Vous pouvez aussi imprimer un champ spécifique en utilisant la variable $n
, où n
est le numéro du champ. Par défaut, les champs sont séparés par des espaces ou des tabulations, mais vous pouvez changer le délimiteur avec l’option -F
.
Par exemple, si vous voulez imprimer le premier et le troisième champ du fichier /etc/passwd
, qui est séparé par des deux-points (:
), vous pouvez utiliser la commande suivante :
awk -F: '{print $1 " " $3}' /etc/passwd
Ce qui donne quelque chose comme :
root 0
daemon 1
bin 2
sys 3
sync 4
games 5
man 6
lp 7
mail 8
news 9
uucp 10
proxy 13
www-data 33
...
Vous pouvez aussi imprimer des expressions arithmétiques ou des chaînes de caractères avec la commande AWK. Par exemple, si vous voulez imprimer le carré du deuxième champ du fichier test.txt
, vous pouvez utiliser la commande suivante :
awk '{print $2^2}' test.txt
Ce qui donne :
est
16
est
Si vous voulez imprimer le nombre de lignes du fichier test.txt
, vous pouvez utiliser la variable spéciale NR
, qui contient le numéro de la ligne courante. Par exemple, vous pouvez utiliser la commande suivante :
awk 'END {print NR}' test.txt
Ce qui donne :
3
Comment filtrer du texte avec la commande AWK ?
La commande AWK peut être utilisée pour filtrer du texte en fonction de motifs ou de conditions. Si vous spécifiez un motif avant une action, AWK n’exécute l’action que si le motif est trouvé dans la ligne. Le motif peut être une expression régulière, une comparaison, une opération logique ou une combinaison de ces éléments.
Par exemple, si vous voulez imprimer les lignes du fichier test.txt
qui contiennent le mot Linux
, vous pouvez utiliser la commande suivante :
awk '/Linux/ {print}' test.txt
Ce qui donne :
Linux est le meilleur système d'exploitation
Si vous voulez imprimer les lignes du fichier /etc/passwd
qui ont un UID supérieur à 1000, vous pouvez utiliser la commande suivante :
awk -F: '$3 > 1000 {print}' /etc/passwd
Ce qui donne quelque chose comme :
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin
tss:x:131:142:TPM software stack,,,:/var/lib/tpm:/bin/false
_rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin
statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin
libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin
libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin
snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false
snap_daemon:x:584788:584788::/nonexistent:/bin/false
...
Vous pouvez aussi utiliser les opérateurs logiques &&
(et), ||
(ou) et !
(non) pour combiner des motifs. Par exemple, si vous voulez imprimer les lignes du fichier /etc/passwd
qui ont un UID supérieur à 1000 et un shell différent de /usr/sbin/nologin
, vous pouvez utiliser la commande suivante :
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
Copier
Ce qui donne quelque chose comme :
tss:x:131:142:TPM software stack,,,:/var/lib/tpm:/bin/false
_rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin
statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin
libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin
libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin
snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false
snap_daemon:x:584788:584788::/nonexistent:/bin/false
...
Comment modifier du texte avec la commande AWK ?
La commande AWK peut être utilisée pour modifier du texte en utilisant des fonctions intégrées ou des variables spéciales. Par exemple, si vous voulez remplacer les espaces par des tirets dans le fichier test.txt
, vous pouvez utiliser la fonction gsub
, qui remplace toutes les occurrences d’une chaîne par une autre. Vous pouvez aussi utiliser la variable spéciale OFS
, qui définit le séparateur de champ de sortie. Par exemple, vous pouvez utiliser la commande suivante :
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Ce qui donne :
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Vous pouvez consulter le manuel de la commande AWK pour connaître les autres fonctions et variables disponibles.
Comment utiliser la boucle for avec la commande AWK ?
La commande AWK peut être utilisée pour effectuer des boucles for sur les champs ou les lignes d’un fichier. La syntaxe de la boucle for est la suivante :
for (variable in tableau) action
Où variable
est le nom de la variable qui prend successivement les valeurs du tableau
, et action
est l’action à effectuer à chaque itération.
Par exemple, si vous voulez imprimer les champs d’un fichier dans l’ordre inverse, vous pouvez utiliser la boucle for avec la variable spéciale NF
, qui contient le nombre de champs de la ligne courante. Par exemple, si vous avez un fichier test.txt
qui contient :
Ceci est un test
AWK est un outil formidable
Linux est le meilleur système d'exploitation
Vous pouvez inverser l’ordre des champs avec la commande suivante :
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Ce qui donne :
test
un
est
Ceci
formidable
outil
un
est
AWK
d'exploitation
système
le
meilleur
est
Linux
Vous pouvez aussi utiliser la boucle for pour parcourir les lignes d’un fichier avec la variable spéciale FNR
, qui contient le numéro de la ligne relative au fichier courant. Par exemple, si vous voulez imprimer les numéros des lignes paires du fichier test.txt
, vous pouvez utiliser la commande suivante :
awk 'FNR%2==0 {print FNR}' test.txt
Ce qui donne :
2
4
Comment exécuter un script AWK ?
Pour exécuter un script AWK, vous pouvez le placer dans un fichier avec l’extension .awk
et lui donner les droits d’exécution avec la commande chmod +x
. Ensuite, vous pouvez lancer le script avec la commande ./nom_du_script.awk [fichiers]
.
Par exemple, si vous avez un script nommé hello.awk
qui contient :
#!/usr/bin/awk -f
BEGIN {print "Bonjour"}
Vous pouvez exécuter le script avec la commande suivante :
./hello.awk
Ce qui donne :
Bonjour
Comment passer des arguments à un script AWK ?
Pour passer des arguments à un script AWK, vous pouvez utiliser deux méthodes :
- La première méthode consiste à utiliser l’option
-v
avec le formatvariable=valeur
. Par exemple, si vous voulez passer deux arguments nommésvar1
etvar2
à votre scripthello.awk
, vous pouvez utiliser la commande suivante :
awk -v var1=hello -v var2=world -f hello.awk
Et dans votre script hello.awk
, vous pouvez accéder aux arguments avec les variables $var1
et $var2
. Par exemple, si votre script contient :
#!/usr/bin/awk -f
BEGIN {print $var1 " " $var2}
Vous obtenez :
hello world
- La deuxième méthode consiste à utiliser le tableau spécial
ARGV
, qui contient les arguments passés au script. Par exemple, si vous voulez passer deux arguments sans nom à votre scripthello.awk
, vous pouvez utiliser la commande suivante :
awk -f hello.awk hello world
Et dans votre script hello.awk
, vous pouvez accéder aux arguments avec les indices ARGV[1]
et ARGV[2]
. Par exemple, si votre script contient :
#!/usr/bin/awk -f
BEGIN {print ARGV[1] " " ARGV[2]}
Vous obtenez :
hello world
FAQ
Quelle est la différence entre AWK et GAWK ?
GAWK est une implémentation GNU de AWK, qui ajoute des fonctionnalités supplémentaires au langage original, comme le support des expressions régulières étendues, des tableaux multidimensionnels ou des fonctions prédéfinies.
Comment débugger un script AWK ?
Pour débugger un script AWK, vous pouvez utiliser l’option -W
avec le paramètre lint
, qui affiche des messages d’avertissement sur les erreurs potentielles dans le script. Vous pouvez aussi utiliser l’option -W
avec le paramètre dump-variables
, qui affiche les valeurs des variables à la fin de l’exécution du script.
Comment utiliser la commande AWK pour trier des données ?
Pour utiliser la commande AWK pour trier des données, vous pouvez utiliser la commande sort
en combinaison avec AWK. Par exemple, si vous voulez trier les utilisateurs du fichier /etc/passwd
par leurs UID, vous pouvez utiliser la commande suivante :
awk -F: '{print $1, $3}' /etc/passwd | sort -n -k2
En associant AWK avec d’autres commandes (ici sort
), vous pouvez facilement aller beaucoup plus loin dans l’affichage et l’organisation des données.
Comment imprimer le nombre de mots d’un fichier avec la commande AWK ?
Pour imprimer le nombre de mots d’un fichier avec la commande AWK, vous pouvez utiliser la variable spéciale NF
, qui contient le nombre de champs de la ligne courante, et la variable spéciale NR
, qui contient le numéro de la ligne courante. En utilisant une boucle for, vous pouvez compter le nombre de mots de chaque ligne et les ajouter à une variable total
. En utilisant le motif spécial END
, vous pouvez imprimer le résultat final. Par exemple, si vous avez un fichier nommé test.txt
qui contient :
Ceci est un test
AWK est un outil formidable
Linux est le meilleur système d'exploitation
Vous pouvez imprimer le nombre de mots du fichier avec la commande suivante :
awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt
Ce qui donne :
9
Comment utiliser la commande AWK pour extraire des données d’un fichier CSV ?
Pour utiliser la commande AWK pour extraire des données d’un fichier CSV (comma-separated values), vous pouvez utiliser l’option -F
pour définir le séparateur de champ comme une virgule. Par exemple, si vous avez un fichier nommé test.csv
qui contient :
nom,prenom,age
Alice,Dupont,25
Bob,Martin,32
Charles,Durand,28
Vous pouvez extraire le nom et l’âge des personnes avec la commande suivante :
awk -F"," '{print $1 " " $3}' test.csv
Ce qui donne :
nom age
Alice 25
Bob 32
Charles 28
Comment filtrer des données avec la commande AWK ?
La commande AWK permet de filtrer des données en fonction de motifs, qui sont des expressions régulières ou des conditions logiques. Les motifs sont placés avant les actions, séparés par des accolades. Par exemple, si vous voulez afficher les lignes du fichier test.csv
qui contiennent le nom Alice
, vous pouvez utiliser le motif suivant :
awk -F"," '/Alice/ {print}' test.csv
Ce qui donne :
Alice,Dupont,25
Si vous voulez afficher les lignes du fichier test.csv
qui ont un âge supérieur à 30 ans, vous pouvez utiliser le motif suivant :
awk -F"," '$3 > 30 {print}' test.csv
Ce qui donne :
Bob,Martin,32
Vous pouvez combiner plusieurs motifs avec les opérateurs logiques &&
(et), ||
(ou) et !
(non). Par exemple, si vous voulez afficher les lignes du fichier test.csv
qui ont un nom commençant par C
ou un âge inférieur à 10 ans, vous pouvez utiliser le motif suivant :
awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Ce qui donne :
CAMILLE,M,7
CLARA,F,11
CLEMENT,M,7
Comment calculer des statistiques avec la commande AWK ?
La commande AWK permet de calculer des statistiques sur les données numériques d’un fichier, comme la somme, la moyenne, le minimum ou le maximum. Pour cela, il suffit d’utiliser des variables pour stocker les valeurs intermédiaires et les mettre à jour à chaque ligne. En utilisant le motif spécial END
, on peut afficher le résultat final. Par exemple, si vous voulez calculer la somme et la moyenne des âges du fichier test.csv
, vous pouvez utiliser le programme suivant :
awk -F"," 'NR>1 {sum+=$3; count++} END {print "Sum: " sum; print "Average: " sum/count}' test.csv
Ce qui donne :
Sum: 110
Average: 18.3333
Explications :
- On utilise l’option
-F","
pour définir le séparateur de champ comme une virgule. - On utilise la condition
NR>1
pour ignorer la première ligne du fichier, qui contient les noms des colonnes. - On utilise les variables
sum
etcount
pour accumuler la somme et le nombre des âges. On utilise l’opérateur+=
pour incrémenter les variables avec la valeur du troisième champ ($3
). - On utilise le motif
END
pour afficher le résultat final. On utilise l’opérateur/
pour calculer la moyenne en divisant la somme par le nombre.
De même, si vous voulez calculer le minimum et le maximum des âges du fichier test.csv
, vous pouvez utiliser le programme suivant :
awk -F"," 'NR>1 {if (min=="") min=max=$3; if ($3<min) min=$3; if ($3>max) max=$3} END {print "Min: " min; print "Max: " max}' test.csv
Ce qui donne :
Min: 6
Max: 32
Explications :
- On utilise l’option
-F","
pour définir le séparateur de champ comme une virgule. - On utilise la condition
NR>1
pour ignorer la première ligne du fichier, qui contient les noms des colonnes. - On utilise les variables
min
etmax
pour stocker le minimum et le maximum des âges. On initialise ces variables avec la valeur du troisième champ ($3
) si elles sont vides (""
). On utilise les opérateurs<
et>
pour comparer les valeurs et mettre à jour les variables si nécessaire. - On utilise le motif
END
pour afficher le résultat final.
Conclusion
La commande AWK est un outil indispensable pour manipuler les textes sous Linux. Elle permet de réaliser des tâches complexes en quelques lignes de code, comme extraire, filtrer, modifier ou calculer des données. Elle offre une grande flexibilité grâce à ses motifs, ses actions, ses fonctions et ses variables. Elle peut être combinée avec d’autres commandes Linux pour étendre ses possibilités. Par exemple, vous pouvez utiliser la commande Echo sur Windows pour afficher un message ou une variable à l’écran. Si vous voulez approfondir vos connaissances sur la commande AWK, vous pouvez consulter le manuel ou les nombreux tutoriels disponibles sur Internet.