Comment maîtriser la commande AWK pour traiter les textes sous Linux ?

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 ?

The AWK Programming Language.svg

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 ?

How to Use the Awk Command on Linux

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 ?

dl.beatsnoop.com thumb 1687289446

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 ?

dl.beatsnoop.com thumb 1687289615

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
dl.beatsnoop.com thumb 1687289757

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 ?

dl.beatsnoop.com thumb 1687289922

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 format variable=valeur. Par exemple, si vous voulez passer deux arguments nommés var1 et var2 à votre script hello.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 script hello.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 et count 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 et max 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.

Article précédentComment sécuriser vos transferts de fichiers avec FTPS sur Windows Server ?
Article suivantComment avoir YouTube Premium gratuit ?
Coucou moi, c'est François :) Rédacteur à mes heures perdues qui adore partager sa passion : Le TT High tech ! 😍 Que ce soit le hardware, le software, les jeux vidéo, social media et tant d'autres domaines sur le site. Je vous partage mes analyses, mes tests, des tutoriels et mes coups de cœur sur divers supports. Je suis un technophile averti et exigeant, qui ne se contente pas de suivre la mode, mais qui cherche à vous orienter vers les meilleures solutions. Alors reste à l'affût !