Tutoriel complet sur awk pour Linux : un guide pratique étape par étape

Dernière mise à jour: 15/12/2025
Auteur: Isaac
  • awk est un outil et un langage de script orienté vers le traitement de texte par lignes et colonnes, idéal pour filtrer, transformer et analyser les résultats de commandes et des fichiers.
  • Il vous permet de définir des modèles et des actions en combinant des expressions régulières, des variables spéciales telles que $0, $1, NF ou NR, et des fonctions telles que length, substr ou match pour créer des filtres très précis.
  • awk fonctionne parfaitement avec les délimiteurs et les champs grâce à FS, OFS et des options comme -F, et peut formatear Affiche des résultats avec print et printf, effectue des opérations mathématiques avec -v.
  • Il est possible de créer des scripts awk complets qui automatisent des tâches complexes, notamment les recherches et les remplacements avec gsub, les calculs avancés et la génération de rapports à partir de commandes telles que ps, df ou les fichiers système.

Tutoriel awk sous Linux

Quand on commence à prendre la console au sérieux Linux Vous découvrez que travailler avec du texte ne se limite pas à consulter des fichiers avec cat Et c'est à peu près tout. Dès que vous entrez dans journaux Pour gérer d'énormes listes de processus, de résultats de commandes ou de fichiers CSV, il vous faut un outil beaucoup plus puissant pour filtrer, transformer et synthétiser les données sans devenir fou.

C'est là qu'intervient le malaise.: une commande qui, plus qu'un simple filtre, est pratiquement un langage de programmation Awk est un outil de traitement de texte qui permet de rechercher des motifs, de sélectionner des colonnes, d'effectuer des calculs, de définir des conditions, d'utiliser des variables, des boucles, des fonctions et même d'écrire des scripts complets. Dans ce tutoriel Awk pour Linux, nous l'explorerons étape par étape, des bases aux utilisations plus avancées, en intégrant de nombreux exemples concrets dans la console.

Qu'est-ce qu'awk et à quoi sert-il sous Linux ?

Awk est à la fois un outil en ligne de commande et un langage de script. Conçu pour analyser des textes structurés en lignes et en champs, son nom provient des initiales de ses créateurs (Aho, Weinberger et Kernighan). Utilisé depuis la fin des années 70, il demeure un élément essentiel dans tout environnement de traitement de texte. Unix ou GNU/Linux (par exemple, pour Exécutez un ancien système Unix sur votre PC).

La philosophie d'awk est très simple.Cette fonction parcourt un fichier (ou la sortie d'une commande) ligne par ligne, divise chaque ligne en colonnes selon un séparateur, vérifie si une condition est remplie et, le cas échéant, exécute une action. Si aucune condition n'est spécifiée, l'action est appliquée à toutes les lignes ; si aucune action n'est spécifiée, la ligne entière est affichée par défaut.

Grâce à ce mécanisme simple, vous pouvez faire des choses vraiment scandaleuses.: de n'afficher que certaines colonnes de ps o df...pour calculer des totaux, filtrer selon des modèles complexes avec des expressions régulières, remplacer du texte, mettre en forme des rapports, travailler avec des fichiers CSV, ou même écrire des scripts de plusieurs dizaines de lignes.

Bien que la commande awk puisse vous rappeler un peu grep ou sedSon approche est plus structurée : considérez les lignes comme des enregistrements et les mots (ou champs) comme des colonnes, avec des variables internes et un mini-langage qui la rend idéale pour traiter rapidement des données tabulaires.

En pratique, si vous voulez commencer à écrire de véritables scripts shell...Il est presque indispensable de connaître awk ainsi que d'autres utilitaires comme sed, grep, cut et compagnie. Ce sont les éléments de base du traitement de texte sous Linux.

Installez et exécutez awk (gawk) sur votre système.

Dans la plupart des distributions GNU/Linux modernesawk est déjà installé par défaut, généralement dans la variante GNU awk (gawkVous pouvez le vérifier avec :

awk --version

Si, pour une raison quelconque, vous ne l'avez pas installéSous Debian, Ubuntu et leurs dérivés, vous pouvez utiliser le gestionnaire de paquets :

sudo apt update && sudo apt install gawk

Il est également disponible sur macOS.Vous pouvez utiliser la version système ou installer une version mise à jour avec Homebrew :

brew install gawk

Une fois installé, awk s'utilise toujours selon le même principe.Vous transmettez des instructions entre guillemets simples et un fichier (ou vous redirigez la sortie d'une autre commande). Par exemple :

awk '{print}' archivo.txt

Vous pouvez également utiliser awk comme interpréteur de scripts., indiquant le chemin d'accès au fichier exécutable sur la première ligne du fichier :

#!/usr/bin/awk -f

et ensuite exécuter le scénario directement ou avec awk -f script.awk.

Syntaxe de base : modèles et actions

Utilisation d'awk dans le terminal

La structure minimale d'awk est :

awk 'patrón { acción }' fichero

Chaque ligne du fichier est comparée au modèle.Si le modèle correspond, l'action entre accolades est exécutée. Si vous omettez le modèle, l'action est appliquée à toutes les lignes. Quelques points clés :

Variables spéciales pour faire référence à chaque ligne:

  • $0: la ligne complète.
  • $1, $2, $3, …: champs (colonnes) de la ligne, séparés par le délimiteur défini.
  • NF: nombre de champs dans la ligne actuelle.
  • NR: numéro d'immatriculation actuel (numéro de ligne global).
  • FNR: numéro de ligne dans le fichier actuel, utile lors du traitement de plusieurs fichiers.

Instructions spéciales:

  • BEGIN { … }: bloc qui s'exécute avant la lecture de toute ligne.
  • END { … }: bloc exécuté après le traitement de toutes les lignes.

Commandes de sortie les plus courantes:

  • print: affiche les arguments séparés par le séparateur de sortie (OFS(par défaut, un espace).
  • printf: similaire à printf En C, il permet une mise en forme détaillée sans ajouter de sauts de ligne automatiques.
  Comment promouvoir un serveur en contrôleur de domaine sous Windows Server : guide complet et mis à jour

Exemple minimal d'impression d'un fichier tel quel, comme s'il était cat:

awk '{print}' archivo.txt

Ou si vous souhaitez qu'il affiche également la longueur de chaque ligne:

awk '{print length, "\t", $0}' archivo.txt

Utilisation des colonnes et des séparateurs dans awk

L'une des utilisations phares d'awk est la manipulation des colonnes. à partir des résultats de commandes tels que ps, df ou des fichiers comme /etc/passwdPar défaut, awk considère tout espace ou tabulation comme un séparateur, mais vous pouvez utiliser pratiquement n'importe quel délimiteur.

Sélectionnez des colonnes spécifiques

Imaginez la sortie de ps avec plusieurs colonnes (PID, TTY, HEURE, CMD…)Si vous souhaitez uniquement voir les PID, il vous suffit de :

ps | awk '{print $1}'

Si vous êtes intéressé par la deuxième colonne (par exemple, le TTY):

ps | awk '{print $2}'

Et si vous souhaitez ignorer la première ligne (l'en-tête)Vous pouvez filtrer par numéro d'immatriculation :

ps | awk 'NR>1 {print $1}'

L'idée est très simple.: chaque nombre après le symbole $ Cela fait référence à la colonne correspondante, toujours par rapport au séparateur actuel.

Modifiez le délimiteur avec -F et avec FS

De nombreux fichiers système ne sont pas séparés par des espaces.mais par d'autres SymbolesUn classique est /etc/passwdoù les champs sont séparés par :Pour traiter ce fichier par colonnes, vous avez deux options : l’option -F sur la ligne de commande, ou la variable FS à l'intérieur d'un bloc BEGIN.

Utiliser l'option -F en ligne de commande:

cat /etc/passwd | awk -F ":" '{print $1}'

Cet exemple ne montre que les noms d'utilisateur. (premier champ) car le séparateur est maintenant :Si vous souhaitez également obtenir l'UID et le GID (champs 3 et 4), il vous suffit de :

cat /etc/passwd | awk -F ":" '{print $1, $3, $4}'

Le problème avec cette commande, c'est que la sortie est agglomérée. Si vous ne définissez pas de séparateurs explicites, vous pouvez ajouter des espaces ou des tabulations manuellement :

cat /etc/passwd | awk -F ":" '{print $1 " " $3 " " $4}'

Si vous souhaitez un résultat plus détaillé, vous pouvez utiliser \t pour insérer des onglets :

cat /etc/passwd | awk -F ":" '{print $1 "\t" $3 "\t" $4}'

L'alternative avec FS dans un bloc BEGIN Il vous permet de définir le séparateur directement dans le script awk :

cat /etc/passwd | awk 'BEGIN { FS=":" } {print $1 "\t" $3 "\t" $4}'

Les deux approches sont fonctionnellement équivalentesbien qu'utilisant BEGIN {FS=...} Il est généralement plus propre d'écrire des scripts .awk réutilisables.

FS et OFS : séparateurs d’entrée et de sortie

En plus de FS (Field Separator), awk possède OFS (Output Field Separator).qui définit comment les champs sont séparés lorsque vous utilisez print avec des virgules :

cat /etc/passwd | awk 'BEGIN { FS=":"; OFS=" - " } {print $1, $3, $4}'

Dans ce cas, vous lisez avec : mais vous écrivez avec - , générant un résultat comme :

root - 0 - 0
daemon - 1 - 1
...

Cette combinaison FS/OFS est très utile pour le « reformatage » des données.Par exemple, pour convertir d'un format à un autre ou pour préparer des fichiers de sortie lisibles que vous exporterez ensuite vers un autre système.

Récupérez le dernier champ avec $NF (et les précédents).

Dans de nombreuses sorties de commandesLe champ qui vous intéresse se trouve à la fin, mais le nombre exact de colonnes varie. C'est là que… $NF (Nombre de champs) vous simplifie la vie : il s'agit toujours du dernier champ de la ligne actuelle.

Par exemple, dans /etc/shells Les chemins d'accès valides au shell apparaissent à la fin de chaque ligne.Parfois dans la deuxième colonne, parfois dans la troisième, etc. Pour n'afficher que le nom du shell (la partie après la dernière barre oblique) :

awk -F "/" '/^\// {print $NF}' /etc/shells

Si vous souhaitez ensuite ne conserver que les valeurs uniques (sans doublons), vous pouvez chaîner avec uniq:

awk -F "/" '/^\// {print $NF}' /etc/shells | uniq

Et si ce qui vous intéresse est l'avant-dernier élément du chemin (par exemple, le répertoire précédent), vous pouvez utiliser $(NF-1) o $(NF-2):

awk -F "/" '/^\// {print $(NF-1)}' /etc/shells

awk -F "/" '/^\// {print $(NF-2)}' /etc/shells

Filtrer les lignes selon des motifs, leur longueur et des conditions logiques

Awk excelle lorsque vous souhaitez vous concentrer uniquement sur certaines lignes. en se basant sur des modèles de texte, des colonnes spécifiques ou des conditions numériques. Combinez des expressions régulières, des opérateurs logiques et des fonctions telles que length pour fabriquer des filtres très précis.

Filtrer par modèles et expressions régulières

La méthode la plus directe pour filtrer par contenu consiste à placer l'expression régulière entre barres obliques. Juste avant les clés :

awk '/patrón/ {print}' archivo.txt

Par exemple, avec le départ de df Vous ne pouvez afficher que les lignes qui commencent par une barre oblique (systèmes de fichiers montés) :

df | awk '/^\// {print}'

Si vous souhaitez une partition spécifique, par exemple /dev/sda5:

df | awk '/^\/dev\/sda5/ {print}'

Vous pouvez également filtrer par motifs au début ou à la fin de la ligne. à l'aide ^ y $:

awk '/^tmpfs/ {print}' archivo.txt
awk '/\/shm$/ {print}' archivo.txt

Et combiner plusieurs critères avec l'opérateur logique &&Par exemple, les lignes qui commencent par tmpfs et se terminent par /dev/shm:

df | awk '/\/shm$/ && /^tmpfs/ {print}'

Filtrez par colonnes et affichez uniquement ce qui vous intéresse.

Souvent, on souhaite filtrer non seulement les lignes, mais aussi les colonnes.Pour continuer df -h, vous ne pouvez afficher que les systèmes de fichiers réels (^/) et conservez ensuite les colonnes 1, 2 et 3 :

  Appels allant directement vers la messagerie vocale sur iPhone : méthodes simples de réparation ?

df -h | awk '/^\// {print $1 "\t" $2 "\t" $3}'

Awk vous permet même de manipuler des champs à la volée.Par exemple, additionnez les colonnes 2 et 3 (utilisé + disponible) pour obtenir une « capacité totale » calculée :

df -h | awk '/^\// {print $1 "\t" $2 + $3}'

Si vous souhaitez ajouter l'unité littérale « G » à la fin du résultat:

df -h | awk '/^\// {print $1 "\t" $2 + $3 "G"}'

Filtrer par longueur de ligne en utilisant longueur()

La fonction length() mesure le nombre de caractères dans une chaîne de caractèresIl est généralement utilisé avec $0 (ligne complète), mais vous pouvez également l'utiliser avec une colonne spécifique.

Pour ne montrer que les lignes de /etc/shells avec plus de 9 caractères:

awk 'length($0) > 9' /etc/shells

Si vous souhaitez connaître la longueur de chaque ligne:

awk '{print length, "\t", $0}' /etc/shells

Vous pouvez également filtrer par longueur, puis n'imprimer que la longueur.:

awk 'length($0) > 9 {print length}' /etc/shells

Combinez plusieurs conditions avec && et si

En plus d'utiliser des expressions régulières au débutVous pouvez écrire des conditions complètes à l'intérieur du bloc en utilisant if, opérateurs de comparaison et logiques.

Par exemple, n'afficher que les lignes de df -h qui commencent par t et dont la colonne 6 comporte plus de 8 caractères:

df -h | awk '/^t/ && length($6) > 8 {print $0}'

Un autre cas typique consiste à rechercher des processus par leur dernier champ. (commande exécutée) à la sortie de ps -efLe dernier champ est $NFVous pouvez donc utiliser :

ps -ef | awk '{ if ($NF == "firefox") print $0 }'

Si vous ne vous souciez que du PID et de la commande:

ps -ef | awk '{ if ($NF == "firefox") print $2, $NF }'

Lignes de contrôle avec NR, plages et longueur de champ

La variable NR (Nombre d'enregistrements) Il comptabilise le nombre de lignes lues à ce jour (globalement). Cela permet des opérations courantes comme ignorer les en-têtes, imprimer des plages de lignes spécifiques ou n'afficher que la première ligne.

Comptez les lignes et n'affichez que la première ou la deuxième.

Pour compter le nombre total de lignes dans un fichier sans utiliser wc -l Vous pouvez faire :

awk 'END {print NR}' archivo.txt

Si vous souhaitez imprimer uniquement la première ligne:

awk 'NR==1 {print}' archivo.txt

Et pour n'afficher que la deuxième ligne:

awk 'NR==2 {print}' archivo.txt

Imprimer à partir d'une ligne ou d'une plage spécifique

Pour afficher toutes les lignes à partir de la troisième Vous pouvez utiliser une condition simple avec > o >=:

ps -aux | awk 'NR>2 {print}'

Si vous souhaitez une plage de valeurs, par exemple les lignes 2 à 4 en /etc/shells:

cat /etc/shells | awk 'NR==2, NR==4 {print $0}'

Vous pouvez également imprimer le numéro de ligne à côté du contenu.:

cat /etc/shells | awk 'NR==2, NR==4 {print NR, $0}'

Longueur de champs spécifiques

En plus de mesurer la longueur des lignes complètesVous pouvez vérifier la longueur d'une colonne spécifique. Par exemple, pour voir combien de caractères le système de fichiers (colonne 1) contient dans la sortie de df -h:

df -h | awk '{print length($1) "\t" $1}'

Si vous souhaitez ignorer l'en-tête (première ligne), ajoute NR>1:

df -h | awk 'NR>1 {print length($1) "\t" $1}'

Fonctions utiles : substr, match, RSTART et RLENGTH

Awk propose un bon assortiment de fonctions de texteDeux des plus puissants pour les recherches avancées sont substr y match, cette dernière accompagnée des variables RSTART y RLENGTH.

Supprimer les éléments du texte avec substr()

La fonction substr(cadena, inicio) o substr(cadena, inicio, longitud) Il vous permet d'extraire des sous-chaînes. Par exemple, pour supprimer les 5 premiers caractères de chaque ligne de /etc/shells:

cat /etc/shells | awk '{print substr($0, 5)}'

Si vous ne souhaitez pas traiter la première ligne (par exemple, un commentaire), vous pouvez utiliser NR :

cat /etc/shells | awk 'NR>1 {print substr($0, 5)}'

Notez que le premier paramètre est une chaîne de caractères (généralement $0) et le second indique quel personnage vous souhaitez commencer à afficher.

Localisation de motifs avec match(), RSTART et RLENGTH

La fonction match(cadena, /regex/) rechercher une expression régulière dans la chaîneSi une correspondance est trouvée, elle renvoie la position de départ (basée sur 1) et remplit deux variables :

  • RSTART: position où commence le motif trouvé.
  • RLENGTH: durée du match.

Par exemple, pour toutes les lignes de ps -aux qui contiennent « cpu »Vous pouvez afficher la ligne entière et la position où se trouve le motif :

ps -aux | awk 'match($0, /cpu/) {print $0 " Contiene \"cpu\" en la posición " RSTART}'

Si vous souhaitez également connaître les dimensions du motif trouvé, il suffit d'utiliser RLENGTH à la sortie :

ps -aux | awk 'match($0, /cpu/) {print $0 " Posición=" RSTART " Longitud=" RLENGTH}'

Ce type de recherche est largement utilisé en analyse de texte et en bioinformatique.Par exemple, sur les fichiers FASTA, lorsque vous souhaitez localiser des motifs spécifiques dans des séquences.

Opérations mathématiques et variables dans awk

Awk ne se limite pas à l'affichage de texte: vous permet d'effectuer des opérations numériques directement sur des champs, des variables internes ou des valeurs que vous transmettez depuis la ligne de commande ou depuis l'environnement shell.

  Je ne peux pas accéder à un dossier partagé : causes, solutions et recommandations détaillées

Définissez les variables avec -vy et utilisez-les dans BEGIN

Vous pouvez déclarer des variables avec l'option -v lors de l'invocation d'awkPar exemple, multiplier deux nombres fixes :

awk -v a="10" -v b="20" 'BEGIN {print "La multiplicación de a x b es", a*b}'

Il est également possible de transmettre des valeurs de variables depuis votre shell.Si vous faites dans bash :

a=1.5
b=4

Vous pouvez ensuite les utiliser dans awk comme ceci ::

awk -v a="$a" -v b="$b" 'BEGIN {print "La multiplicación de a x b es", a*b}'

Le bloc BEGIN est utilisé ici car nous ne traitons aucun fichier.Nous voulons simplement exécuter le code une seule fois et afficher un résultat.

Fonctions mathématiques : racine carrée et boucles for

Awk intègre plusieurs fonctions mathématiques standard.Comme sqrt() pour les racines carrées. Par exemple, la racine carrée de 400 :

awk 'BEGIN {print sqrt(400)}'

Vous pouvez également le combiner avec des boucles for. pour générer des listes complètes :

awk 'BEGIN { for(i=1; i<=10; i++) print "La raíz cuadrada de", i*i, "es", i }'

Ou parcourir les valeurs décimales de 0 à 1 par petits incréments:

awk 'BEGIN { for(i=0; i<=1; i=i+0.00001) print "La raíz cuadrada de", i*i, "es", i }'

Ces types de structures rendent l'awk très similaire à une langue traditionnelle.bien que son format naturel reste la colonne.

Écriture et exécution de scripts complets avec awk

Lorsque les commandes awk commencent à devenir longues Si vous souhaitez réutiliser des transformations complexes, la solution la plus judicieuse consiste à les enregistrer dans un fichier script avec l'extension . .awk (même si ce n'est pas obligatoire).

Un exemple typique consiste à traiter la sortie de df Afficher uniquement certaines entrées répondant aux critères d'espace disponible et formater les résultats sous forme de petit tableau.

Imaginez que vous vouliez ce qui suit:

  • Afficher uniquement les systèmes de fichiers dont le nom commence par « t » (par exemple tmpfs).
  • Filtrer les éléments dont la capacité disponible (colonne 4) est supérieure à 6000K.
  • N'affichez que l'unité (colonne 1) et la somme des colonnes 2 et 3. comme espace total approximatif.

Vous pouvez créer un script appelé capacidad.awk avec un contenu similaire à celui-ci (adapté et simplifié) :

#!/usr/bin/awk -f
BEGIN { printf "%s\n", "Voy a extraer las partes que me interesan del comando df" }
BEGIN { printf "%s\t%s\n", "Unidad", "Capacidad disponible" }
/^t/ && $4 > 6000 {print $1 "\t" $2 + $3 "K"}

Puis exécutez-le en chaînant la sortie de df.:

df | awk -f capacidad.awk

Si vous souhaitez améliorer l'apparence de la table, vous pouvez remplacer print par printf et utilisez des formats comme %-12s (texte justifié à gauche en 12 caractères) ou %-23d (Nombre décimal sur 23 caractères). Cela vous permet un contrôle parfait de l'alignement des colonnes.

Rechercher et remplacer du texte avec gsub()

Awk peut également effectuer des remplacements de texte. similaire à ce que vous feriez avec sed, en utilisant la fonction gsub() (substitut global).

La syntaxe générale est :

gsub("texto_o_regex_a_buscar", "texto_de_reemplazo", destino)

Par exemple, supposons un fichier geekland.txt avec le texte « Geekland est le meilleur blog technologique » et vous souhaitez remplacer le G initial par un g :

awk '{ gsub("G", "g", $0); print $0 }' geekland.txt

Si vous ne spécifiez pas le troisième paramètre, la recherche est effectuée sur $0 par défautToutefois, il est très fréquent de limiter le remplacement à une seule colonne :

df -h | awk '{ gsub("M", "G", $2); print $2 }'

Dans ce cas, nous avons seulement changé l'unité M en G dans la colonne 2Si vous souhaitez également que la colonne 1 soit correctement alignée, vous pouvez la combiner avec printf:

df -h | awk '{ gsub("M", "G", $2); printf "%-12s %-12s\n", $1, $2 }'

Ce modèle consiste à « modifier une colonne puis à imprimer la mise en forme ». Il est extrêmement utile pour les rapports, les migrations de données ou le nettoyage rapide des résultats de commandes.

Utilisations supplémentaires : chat infecté par des stéroïdes et exécution de commandes

Même si cela peut paraître absurdeawk peut agir comme cat Amélioré, car il peut afficher un fichier tout en ajoutant des informations supplémentaires (numéros de ligne, longueurs, etc.).

Une utilisation triviale serait:

awk '{print}' functions.php

Mais vous pouvez également numéroter les lignes ou appliquer n'importe quel filtre. sans avoir besoin d'utiliser d'outils supplémentaires.

Autre fait intéressant : awk peut exécuter des commandes système. par fonction system()Par exemple, pour afficher le répertoire courant :

awk 'BEGIN { system("pwd") }'

Ce n'est pas la pratique la plus courante dans les scripts simples.Mais c'est bon à savoir que cela existe lorsqu'on développe des outils plus complexes basés sur awk.

Awk devient un outil multifonction pour le traitement de texte sous Linux.Il permet de filtrer les lignes, de sélectionner et de combiner les colonnes, de remplacer des fragments, de mesurer des longueurs, de localiser des modèles, de calculer la somme des champs, de générer des rapports formatés concis et même de créer des scripts complets qui traitent le résultat d'autres commandes. Une fois maîtrisé, il devient un outil indispensable pour tous vos travaux avec… terminal et des données structurées.

Exécuter un tutoriel Unix ancien
Article connexe:
Comment exécuter d'anciens systèmes UNIX sur votre PC : SIMH, Docker, V7/V8, BSD et plus encore