In this article

La commande awk sous Linux: comprendre la syntaxe, les options et les exemples courants

awk est une commande Linux largement utilisée pour les tâches de traitement de texte. Vous pouvez utiliser cette commande directement dans le terminal pour extraire des données d’un fichier texte, rechercher des motifs et effectuer des actions simples comme le formatage du texte.

Cette commande est aussi un langage de script, ce qui signifie qu’elle peut être utilisée pour écrire des programmes à part entière. Cependant, cet article se concentrera sur ce que vous pouvez faire avec awk dans le terminal pour manipuler des fichiers texte. Nous aborderons la syntaxe, les cas d’usage courants et répondrons aux questions les plus fréquentes.

Syntaxe de la commande awk

Au cœur de son fonctionnement, la commande awk prend deux types d’entrée : un fichier texte et un ensemble d’instructions. Cela se reflète dans la syntaxe de base :

awk '{ action }' filename.txt
  • action correspond à l’action que vous souhaitez effectuer sur votre fichier texte.
  • filename est le fichier texte.

Au niveau le plus élémentaire, la syntaxe de la commande awk est très simple. Tout ce dont vous avez besoin, c’est d’un fichier texte avec lequel interagir et d’une action à effectuer.

Options et variations de syntaxe

Votre commande awk de base peut être encore étendue en ajoutant des options.

  • -F : définit un séparateur de champs.
  • -v : définit des variables.
  • -f : lit le script à partir d’un fichier.

Comme awk traite les caractères d’espacement (espaces ou tabulations) comme délimiteur par défaut entre les champs dans un fichier ou en entrée-F lui indique comment interpréter les colonnes ou les champs de chaque ligne en fonction d’un délimiteur. En d’autres termes, lorsque vous utilisez -F, awk sait comment scinder chaque ligne en parties (champs).

En utilisant votre document précédent, vous pouvez utiliser -F comme argument de ligne de commande pour définir les deux-points comme séparateur de champs.

awk -F':' '/house/ { print "ID:", $1, "- Type:", $2, "- Location:", $3 }' filename.txt

awk identifie le séparateur et interprète les champs en conséquence :

ID: 1 - Type: Big house - Location: New York

ID: 2 - Type: Small house - Location: Los Angeles

ID: 4 - Type: Houseboat - Location: Seattle

Pour affecter une variable en ligne de commande, vous pouvez exécuter :

awk -v word="house" '$0 ~ word { print $0 }' filename.txt

word est désormais une variable qui peut être utilisée dans votre action.

Enfin, l’option -f est utile pour exécuter plusieurs commandes awk à la fois depuis la ligne de commande au sein d’un seul script. Imaginez que vous avez un fichier simple_script.awk contenant ce qui suit :

# Print the line number and the line content if the line contains the word "house"

$0 ~ /house/ { print NR, $0 }

# Print a message before every output

BEGIN { print "Starting to search for 'house'..." }

Vous pouvez l’exécuter avec :

awk -f simple_script.awk filename.txt

Et vous aurez :

Starting to search for 'house'...
1:Big house:New York
2:Small house:Los Angeles
4:Houseboat:Seattle

Création d’un fichier d’exemple

Avant d’aborder les cas d’usage, vous devrez créer un fichier d’exemple.

Pour les besoins de cet exemple, nous continuerons à utiliser des maisons et des lieux comme exemples, mais nous créerons un tout nouveau fichier d’entrée.

Pour ce faire, utilisez simplement la commande touch pour créer un nouveau fichier :

touch houses.txt

Comme le fichier est vide, nous devons le remplir. Modifions aussi les types d’habitation de notre premier exemple : nous pourrions vouloir une petite maison dans le Vermont, une grande maison à San Diego, un appartement à New York et une péniche à Londres. Nous ajouterons également les mètres carrés pour chaque logement.

Vous pouvez utiliser votre éditeur de texte préféré (par exemple nano ou vim), ou ajouter des données directement avec echo.

echo -e "1:Small house:Vermont:100 sqm\n2:Large house:San Diego:300 sqm\n3:Apartment:New York:70 sqm\n4:Houseboat:London:40 sqm" > houses.txt

Désormais, houses.txt est prêt à être utilisé dans nos exemples awk.

Exemples de la commande awk

Voyons comment utiliser la commande awk sur notre fichier houses.txt dans plusieurs cas d’usage. Vous trouverez ci-dessous une liste de scénarios courants.

1. Afficher toutes les lignes d’un fichier

Pour afficher toutes les lignes d’un fichier d’entrée, exécutez la commande suivante :

awk '{print}' houses.txt

Cela renverra ce qui suit :

1:Small house:Vermont:100 sqm

2:Large house:San Diego:300 sqm

3:Apartment:New York:70 sqm

4:Houseboat:London:40 sqm

2. Affichage d’une colonne spécifique

Comme nous l’avons déjà vu, awk découpe chaque ligne d’un fichier texte en champs (ou colonnes) en utilisant les caractères d’espacement comme séparateur. Dans notre cas, nous utilisons un deux-points ( 🙂 . Pour imprimer des colonnes spécifiques, nous devons connaître la position de la colonne dans la ligne.

Imaginons que nous voulions imprimer la colonne contenant la superficie en pieds carrés de chaque maison. Pour ce faire, nous allons exécuter :

awk -F':' '{print $4}' houses.txt

Le résultat sera :

100 sqm

300 sqm

70 sqm

40 sqm

Ici :

  • -F’ :’ indique à awk d’utiliser le deux-points (:) comme séparateur de champs.
  • $4 affiche le quatrième champ (superficie en pieds carrés).

3. Affichage des lignes correspondant à un motif

Imaginons que vous ne vous intéressiez qu’aux lignes de votre fichier d’entrée qui contiennent un certain mot, ou qui correspondent à un certain motif. Pour ce faire, vous devrez utiliser des expressions régulières.

Les expressions régulières sont une technique de correspondance de motifs, et elles peuvent être utilisées pour créer des motifs complexes afin d’extraire des parties de texte très spécifiques. Ici, nous allons utiliser une expression régulière très simple.

Par exemple, si vous souhaitez afficher la ligne entière contenant le mot « Houseboat » à partir de votre fichier d’entrée, vous exécuterez :

awk -F ':' '/Houseboat/ {print}' houses.txt

Ce qui vous donnera :

4:Péniche:Londres:40 m²

/Houseboat/ est le motif regex : nous indiquons au système de rechercher toutes les correspondances du mot « Houseboat ».

4. Extraction et affichage de colonnes à l’aide de la manipulation de champs

Vous pouvez également manipuler les champs dans votre fichier texte et les afficher dans un ordre différent.

Supposons que vous souhaitiez afficher chaque ligne de notre fichier texte comme une annonce immobilière. Vous pouvez :

awk -F ':' '{print "For sale:", $2, "in", $3, ".", "Square footage:", $4}' houses.txt

L’exécution de cette commande affichera :

La commande vous permet de réorganiser et de mettre en forme les champs comme vous le souhaitez. Par exemple, vous pourriez permuter $2 et $3 pour afficher l’emplacement avant le type de maison.

5. Calcul d’opérations mathématiques

La commande awk peut effectuer des calculs.

Ajoutons une colonne à nos données contenant le prix de chaque bien.

awk -F ':' '{print $0, ": $", NR * 100000}' houses.txt > priced_houses.txt

Cette commande crée un fichier priced_houses.txt avec les prix de tous les biens. Par souci de simplicité, nous allons inventer des prix basés sur le numéro de ligne avec : , NR * 100000.

1:Small house:Vermont:100 sqm: $100000

2:Large house:San Diego:300 sqm: $200000

3:Apartment:New York:70 sqm: $300000

4:Houseboat:London:40 sqm: $400000

Maintenant que nous avons quelques nombres, nous pouvons tester des opérations mathématiques.

Pour calculer le coût total des propriétés, vous allez additionner la dernière colonne, où les prix sont stockés (5 €) :

awk -F ':' '{gsub("[$,]", "", $5); sum += $5} END {print "Total cost:", sum}' priced_houses.txt

Ce qui affiche :

Coût total : 1000000

Ici :

  • gsub(« [$,] », «  », $5) supprime tout signe dollar ou toute virgule du prix dans le cinquième champ (afin de permettre un calcul correct).
  • sum += 5 € ajoute le prix au total cumulé.
  • END {print « Total cost: », sum} affiche le coût total après traitement de toutes les lignes.

6. Traitement des données basé sur des instructions conditionnelles

Pour calculer uniquement le prix des biens sélectionnés — disons l’appartement à New York et la péniche à Londres — vous devrez utiliser des instructions conditionnelles.

awk -F ':' '($2 == "Apartment" || $2 == "Houseboat") {gsub("[$,]", "", $5); sum += $5} END {print "NY + LDN, total cost:", sum}' priced_houses.txt

Dans cet exemple :

  • $2 == « Apartment » || $2 == « Houseboat » est la condition qui garantit que seules les lignes contenant « Apartment » ou « Houseboat » sont traitées. || est le symbole conditionnel pour « OU ».
  • gsub(« [$,] », «  », $5) supprime les signes dollar ou les virgules.
  • sum += 5 € ajoute le prix à la somme.
  • END {print « NY + LDN, total cost: », sum} affiche le coût total pour les propriétés sélectionnées.

La commande ci-dessus affichera :

NY + LDN, coût total : 700000

En utilisant notre fichier d’entrée original houses.txt, vous pouvez utiliser une autre instruction conditionnelle pour, par exemple, n’afficher un bien que s’il est supérieur à 50 m² :

awk -F ':' '{if ($4 > 50) print $2, "dans", $3, ":", "OK"; else print $2, "dans", $3, ":", "trop petit."}' houses.txt

La commande ci-dessus utilise une instruction conditionnelle if-else simple, séparée par un point-virgule ( ;). Cela affichera :

Vous trouverez toutes les instructions conditionnelles dans le manual de l’utilisateur de GNU Awk.

7. Utiliser les variables intégrées

awk dispose de plusieurs variables intégrées, à la fois numériques et de type chaîne, qui sont prédéfinies dans le langage.

Voici les plus couramment utilisés :

  • NR (nombre d’enregistrements)
  • NF (nombre de champs)
  • FS (séparateur de champs)
  • OFS (séparateur de champs de sortie)
  • Nom de fichier
  • RS (séparateur d’enregistrements)

Par exemple, pour afficher le nombre de champs dans chaque ligne, exécutez :

awk -F ':' '{print "Line", NR, "has", NF, "fields"}' houses.txt

Ce qui afficherait :

Line 1 has 4 fields

Line 2 has 4 fields

Line 3 has 4 fields

Line 4 has 4 fields

Si vous souhaitez utiliser OFS pour définir le séparateur entre les champs lors de l’affichage de la sortie, vous pouvez exécuter :

awk 'BEGIN {OFS="XXXX"} {print $1, $2, $3, $4}' houses.txt

Ce qui affichera :

1:SmallXXXXhouse:Vermont:100XXXXsqmXXXX
2:LargeXXXXhouse:SanXXXXDiego:300XXXXsqm
3:Apartment:NewXXXXYork:70XXXXsqmXXXX
4:Houseboat:London:40XXXXsqmXXXXXXXX

8. Utilisation des fonctions définies par l’utilisateur

Avec awk, vous pouvez manipuler votre texte plus efficacement en utilisant des fonctions directement dans le terminal.

Par exemple, pour convertir la deuxième colonne (types de maisons) en minuscules, vous exécuterez :

awk -F ':' '{print tolower($2)}' houses.txt

Ce qui donne :

small house

large house

apartment

houseboat

Ici, tolower($2) est la fonction utilisée.

Si vous souhaitez remplacer le mot « house » par « mansion » dans la deuxième colonne :

awk -F ':' '{gsub(/house/, "mansion", $2); print $2}' houses.txt

gsub(/house/, « mansion », $2) est la fonction.

Small mansion

Large mansion

Apartment

Houseboat

Conclusion

La commande awk de Linux est un puissant outil de traitement que les développeurs peuvent utiliser pour extraire, manipuler et traiter des données à partir de fichiers texte. Cela peut s’avérer particulièrement utile pour des tâches comme l’analyse de journaux ou même de fichiers CSV, puisqu’il prend en charge les opérations mathématiques, la correspondance de motifs et la manipulation de champs.

En maîtrisant les bases d’awk, vous serez rapidement en mesure de l’utiliser efficacement pour diverses tâches, de garder des documents épurés et de disposer de fonctions puissantes à portée de main.

FAQ sur la commande awk

À quoi awk est-il le plus utile ?

awk est un outil puissant pour les opérations arithmétiques comme pour les opérations sur les chaînes de caractères. Il est particulièrement adapté au traitement de textes, à l’extraction et à la manipulation de données structurées, à la correspondance de motifs, aux opérations basées sur des champs et aux calculs.

En quoi awk est-il différent de sed ?

Ces deux éléments sont des commandes Linux. Cependant, sed convient mieux à l’édition ligne par ligne et à la manipulation de texte de base, tandis qu’awk est un langage de programmation complet qui permet d’utiliser des structures conditionnelles et d’effectuer des calculs, ainsi que de traiter des données par champs.

awk peut-il gérer de grands jeux de données ?

Comme awk fonctionne ligne par ligne plutôt que de charger l’intégralité du fichier en mémoire, il peut traiter des jeux de données volumineux. Cependant, lors de l’exécution d’opérations extrêmement complexes sur des fichiers très volumineux, les performances peuvent en pâtir.

Tout le contenu des tutoriels de ce site est soumis aux normes éditoriales et aux valeurs rigoureuses de Hostinger.

Author
L'auteur

Katerina Bosinaki

Katerina is a Localization Project Manager at Hostinger, bringing over 5 years of project management experience and a 6-year background as a linguist. She focuses on making technology more approachable by transforming complex guides into clear, easy-to-follow tutorials. In her free time, when she’s not staying up-to-date with the latest in localization, she enjoys watching movies and reading books.

Ce que disent nos clients

Laissez une réponse

Veuillez remplir les champs obligatoires.Veuillez cocher la case de la confidentialité.Veuillez remplir les champs obligatoires et accepter la case de confidentialité.

Thank you! Your comment has been successfully submitted. It will be approved within the next 24 hours.