Maîtriser la commande awk sous Linux pour le traitement de données
Lire un fichier par ligne, découper chaque ligne en champs et vous permettre d’appliquer différents filtres, c’est la mission de la commande awk disponible sous Linux. Ce guide technique va vous aider à prendre en main cette commande indispensable pour manipuler des fichiers bruts, notamment les fichiers de logs.
La commande awk adopte une syntaxe bien particulière qui fait toute sa richesse, notamment avec son système de scripts internes capables de transformer des données brutes en informations exploitables. Grâce à awk, un utilisateur peut accomplir diverses opérations sur une entrée (un texte, un fichier) :
- Extraire des colonnes spécifiques d’un fichier.
- Effectuer des calculs arithmétiques sur des données chiffrées.
- Formater des sorties complexes.
- Filtrer des lignes selon des conditions logiques avancées.
- Etc.
Awk, c’est plus qu’une simple commande, c’est un langage de traitement de fichiers plats. Il a été créé en 1977 et son nom fait justement référence à ses trois créateurs : Alfred Aho, Peter Weinberger et Brian Kernighan.
Pour traiter les fichiers texte sous Linux, awk est donc complémentaire à d’autres outils comme grep, sed ou encore sort. D’ailleurs, il n’est pas rare de coupler l’utilisation d’awk avec une autre de ces commandes (pour filtrer avec grep puis extraire avec awk, par exemple).
Sommaire
- La syntaxe de la commande awk
-
Prise en main d’awk
- Manipuler un fichier texte avec awk
- Manipuler un fichier CSV avec awk
- Les mathématiques avec awk
- L’utilisation de if-else avec awk
- Modifier le séparateur de la sortie avec OFS
- Analyser les logs de connexion SSH
- Analyser les logs avec un script awk
- Filtrage avec les expressions régulières
- Analyser les journaux Apache2 avec Awk
- Filtrage de processus par utilisateur
- Afficher la liste des adresses IP avec Awk
- Conclusion
- FAQ – Awk
La syntaxe de la commande awk
La puissance de la commande awk réside dans la souplesse de sa syntaxe où les possibilités sont nombreuses, mais c’est aussi ce qui fait sa complexité. Pour bien appréhender le sujet, prenons le temps d’étudier la syntaxe et le fonctionnement interne d’awk.
La structure fondamentale d’une commande awk repose sur une logique simple : pour chaque ligne en entrée, on vérifie si elle correspond à un critère, et si c’est le cas, on exécute une action.
La commande awk s’écrit de plusieurs façons, selon les fonctionnalités utilisées et la complexité de la requête :
La partie sert à déterminer les tests et actions à effectuer, et comme nous le verrons par la suite, cela peut aller loin grâce à la prise en charge d’instructions.
Note : si aucun fichier n’est spécifié, awk lira l’entrée standard (stdin), ce qui permet de l’utiliser facilement à la fin d’un pipe (|). Autrement dit, vous pouvez faire un cat ou un grep qui envoie son résultat à awk pour traitement.
Les options
Lorsque vous appelez la commande awk, il n’est pas nécessaire de spécifier une ou plusieurs options. Cependant, il existe beaucoup d’options différentes, notamment celles-ci, fréquemment utilisées :
| Option | Description |
| Définit un séparateur de champs personnalisé (par défaut, c’est l’espace). Cela est notamment utile pour les CSV afin de préciser le séparateur, généralement la virgule ou le point-virgule. | |
| Lit le programme (script) awk à partir d’un fichier externe. | |
| Assigne une valeur à une variable avant l’exécution du programme. |
L’occasion de préciser que vous pouvez obtenir de l’aide en exécutant cette commande :
Le découpage d’une ligne
Quand un fichier est lu à l’aide de la commande awk, il faut savoir que les lignes sont lues une par une et que chaque ligne est découpée en champs de façon automatique. Par défaut, un enregistrement correspond à une ligne, et un champ correspond à un mot séparé par un espace (vous pouvez ajuster via l’option ).
Au cours de l’exécution et du traitement, cela va donner lieu à un ensemble de variables alimentées automatiquement par awk :
| Variable | Correspondance |
|---|---|
| La ligne entière | |
| Le premier champ de la ligne | |
| , , … | Les champs 1, 2 et 3 de la ligne (tout dépend du nombre de valeurs) |
| Le dernier champ de la ligne |
Les instructions de contrôle de flux
La commande awk prend en charge des instructions pour le contrôle de flux, comme un moteur de script interne à cet outil : , , , . Ainsi, lors de l’écriture d’une commande awk, vous pouvez utiliser une ou plusieurs instructions et les regrouper à l’aide d’accolades .
Voici un tableau récapitulatif des instructions de contrôle de flux (conditions et boucles) utilisées dans awk. Elles suivent une syntaxe très proche du langage C.
| Instruction | Syntaxe / Exemple | Description |
| if / else | Exécute une action si la condition est vraie, sinon exécute l’action alternative. | |
| while | Répète une action tant que la condition est vraie (vérifiée au début). | |
| do…while | Similaire à , mais exécute le bloc au moins une fois avant de vérifier la condition. | |
| for | Boucle classique avec initialisation, condition et incrémentation. | |
| break | Sort immédiatement de la boucle en cours ( ou ). | |
| continue | Ignore le reste du bloc et passe directement à l’itération suivante de la boucle. |
Les opérateurs logiques
Voici le tableau pour les opérateurs logiques dans awk. Ils sont essentiels pour combiner plusieurs critères de recherche sur une même ligne.
| Opérateur | Nom | Description |
| ET (AND) | La condition globale est vraie seulement si les deux conditions sont vraies. | |
| || | OU (OR) | La condition globale est vraie si l’une ou l’autre des deux conditions est vraie. |
| N’EST PAS (NOT) | Inverse le résultat. Si la condition est vraie, elle devient fausse (et vice-versa). |
Les blocs spéciaux
Awk supporte deux blocs spéciaux destinés à s’exécuter avant () et après () avoir traité l’ensemble du fichier.
| Caractéristique | Bloc BEGIN { … } | Bloc END { … } |
| Moment d’exécution | Avant de lire la première ligne du premier fichier. | Après avoir lu la dernière ligne du dernier fichier. |
| Fréquence | S’exécute une seule fois | S’exécute une seule fois |
| Usage principal | – Initialiser des variables (comme , le séparateur de champs, en tant qu’alternative à ). – Afficher des titres des colonnes. |
– Afficher les résultats finaux (sommes, moyennes, etc.). – Afficher un message de fin. – Générer un rapport récapitulatif. |
| Accès aux données | Aucune donnée de fichier n’est disponible, car awk n’a pas commencé à le lire (, , sont vides). | Les variables accumulées sont disponibles. Ainsi, contient la dernière ligne lue. |
Prise en main d’awk
Désormais, nous allons apprendre à manipuler awk au travers de différents exemples. L’idée étant de commencer avec des choses basiques, avant d’ajouter des éléments supplémentaires pour exploiter le potentiel d’awk et ainsi mettre en pratique ce qui a été évoqué dans la précédente partie de cet article.
Manipuler un fichier texte avec awk
Prenons un exemple simple avec un fichier texte nommé , dont le contenu est le suivant :
Si nous souhaitons afficher uniquement le prénom et le nom de l’organisation, nous devrions cibler en principe les champs numéro 1 et 4. En effet, par défaut, awk sépare les champs par un espace. L’instruction print sera utilisée pour afficher les informations dans la console.
Ce qui donne :
Remarque : pour aller plus loin dans le formatage de la sortie, vous devez utiliser à la place de , notamment pour limiter le nombre de caractères ou ajuster l’affichage des nombres. Mais, attention, n’ajoute pas automatiquement de retour à la ligne, donc vous devez l’ajouter manuellement quand nécessaire via l’ajout de dans votre commande.
Manipuler un fichier CSV avec awk
Maintenant, imaginons que notre fichier précédent soit au format CSV avec un contenu plus structuré. Créons le fichier avec ce contenu :
Pour obtenir le même résultat que précédemment, nous devons ajouter l’option pour préciser que le séparateur entre les champs est le caractère point-virgule.
Le résultat précédent correspond à nos attentes, mais il affiche la première ligne correspondante aux en-têtes du fichier CSV. Si l’on veut éliminer cette première ligne, il est nécessaire d’affiner la commande awk. Plusieurs solutions sont envisageables, en voici une :
Ici, on dit simplement à : “Exécute cette action seulement si le numéro de ligne est supérieur à 1“, en faisant référence à qui est une variable dynamique qui contient le numéro de la ligne courante (comme un numéro d’index).
Cette syntaxe fonctionne correctement, mais elle montrerait ses limites si l’on traitait plusieurs fichiers CSV. En effet, awk est capable d’agir sur plusieurs fichiers : il suffit de spécifier les noms de fichiers les uns à la suite des autres, en les séparant par un espace.
Si vous traitez plusieurs fichiers CSV en une seule commande, sachez que continue de s’incrémenter (il ne revient pas à 1 au début du deuxième fichier). De ce fait, l’en-tête du second fichier ne sera pas supprimée… Pour ignorer l’en-tête de chaque fichier individuellement, utilisez (File Number of Records) à la place de NR, en respectant la même syntaxe.
Les mathématiques avec awk
Awk est capable d’effectuer des opérations simples, comme une addition ou le calcul d’une moyenne, en se référant aux valeurs d’une colonne. C’est notamment applicable sur un fichier CSV. Ajoutons une colonne salaire au fichier CSV utilisé précédemment :
Désormais, nous allons justement tenter de faire la somme des salaires et de calculer le salaire moyen.
Additionner l’ensemble des valeurs d’une colonne :
Awk est parvenu à faire la somme des salaires grâce à l’utilisation de la variable (donnez le nom que vous souhaitez). À chaque fois qu’une ligne est traitée, la valeur de la colonne n°5, soit la colonne , sera ajoutée. Nous n’avons pas eu besoin de déclarer au début, car initialise automatiquement les variables vides à 0.
C’est la partie clé de cet exemple. Jusqu’ici, toutes les actions que nous écrivions s’exécutaient pour chaque ligne. Si nous avions mis le à côté du calcul, nous aurions eu un affichage à chaque ligne (par exemple : “Total temporaire : 2000“, “Total temporaire : 4000“, etc.).
Le bloc est un bloc spécial qui s’exécute une seule fois, uniquement après que la lecture du fichier soit entièrement terminée (comme son nom l’indique). Ce qui signifie que :
- Sans : awk est une boucle qui traite le fichier ligne par ligne.
- Avec : On dit à awk : “Fais tes calculs en silence sur tout le fichier, et une fois que tu as fini de lire la dernière ligne, exécute ce bloc pour me donner le résultat final.”
C’est l’équivalent d’une caissière qui scanne tous vos articles (le bloc principal) et qui, seulement à la fin, appuie sur le bouton “Total” pour vous donner le prix à payer (le bloc ).
Calculer la moyenne :
La commande ci-dessus s’appuie sur une variable intermédiaire, nommée (par habitude), qui s’incrémente (+1) à chaque fois qu’une nouvelle ligne est traitée. Elle sert à compter le nombre de lignes, pour savoir par combien diviser le total afin d’obtenir la moyenne. Le calcul de la moyenne est effectué directement au niveau du print, avec , où j’ai pris soin d’exclure le calcul des blocs entre guillemets.
Même si cette syntaxe permet d’obtenir le résultat attendu, nous aurions pu faire autrement et peut-être même plus simple. En effet, awk contient une variable déjà conçue pour indiquer le numéro de ligne : . Ainsi, quand awk est arrivé à la fin du fichier, la variable est égale au nombre de lignes. Cela évite de devoir générer une autre variable (comme ), mais attention, nous devons penser à soustraire 1 (soit ) pour ne pas tenir compte de la ligne des en-têtes.
Ce qui donne :
Enfin, sachez que vous pouvez aussi filtrer les données avec awk. Voici par exemple comment afficher uniquement le nom des personnes qui ont un salaire supérieur ou égal à 2000 euros :
Awk supporte les opérateurs de comparaison classiques : , , , , , . C’est idéal pour filtrer des données numériques.
L’utilisation de if-else avec awk
Amusons-nous à utiliser une structure conditionnelle if-else pour déterminer s’il s’agit d’un salaire de junior ou de sénior. Positionnons le curseur entre les deux statuts à 2000 : toutes les valeurs inférieures correspondent à un profil junior. L’idée étant de voir l’utilisation de et de avec Awk.
Nous travaillons toujours sur le même fichier CSV que précédemment.
Cette commande examine le salaire de chaque employé (colonne 5) pour effectuer un tri automatique. Le bloc conditionnel agit comme un premier filtre : si la valeur du salaire est supérieure ou égale à 2000, la commande valide la condition (car elle est vraie) et affiche le nom suivi du statut “Senior”. Dans le cas contraire, l’instruction (sinon) sert d’alternative systématique : elle capture tous les cas qui ont échoué au test précédent (donc tous les salaires inférieurs à 2000) pour leur attribuer par défaut le statut “Junior”.
Modifier le séparateur de la sortie avec OFS
Ce nouvel exemple va permettre de mettre en pratique , ainsi que en tant qu’alternative à :
- (Field Separator) : elle définit le séparateur d’entrée. Elle est définie dans un bloc d’initialisation .
- (Output Field Separator) : définit le séparateur de sortie. Par défaut, lorsque vous faites , insère un espace entre les deux valeurs (vous l’avez peut être remarqué avec les exemples précédents). En modifiant la valeur de , vous pouvez formater la sortie différemment.
La commande ci-dessous affiche la liste de tous les utilisateurs du système Linux et leur Shell par défaut, séparés par une flèche sous la forme . Cela implique une lecture du fichier où les valeurs sont séparées par le caractère .
Ce qui donne :
La sortie sera sous cette forme :
Analyser les logs de connexion SSH
Sur une machine Linux, cherchons à analyser les journaux de connexion SSH pour identifier les tentatives de connexion en échec (mauvais mot de passe). L’objectif étant de sortir une liste des adresses IP à l’origine des tentatives de connexion, tout en spécifiant le nombre d’échecs pour chaque adresse IP. Pour répondre à ce besoin, il est préférable de ne pas utiliser seulement awk, mais plutôt de le coupler à deux autres commandes et .
Ce qui donne :
Pour comprendre cette commande, il faut la lire de gauche à droite. Tout simplement parce que chaque étape transforme la donnée pour l’étape suivante.
1 – Récupérer les informations à analyser
Le point de départ pour récupérer les journaux SSH étant d’exécuter cette commande (on récupère uniquement les 1000 dernières lignes dans cet exemple) :
Ici, c’est sur Debian 13 donc il n’y a pas le fichier / en absence de rsyslog. C’est pour cette raison que l’on récupère les logs du service SSH de cette façon. Nous obtenons cette sortie (extrait) :
2 – Filtrer et extraire les données intéressantes
Ici, ne calcule rien. Son seul rôle est de filtrer et d’extraire. Il cherche les lignes , trouve le mot , et nous donne juste l’adresse IP qui suit. Une longue liste d’adresses IP en vrac.
Pour récupérer l’adresse IP alors que sa position peut changer selon le type d’erreur, nous ne pouvons pas viser une colonne fixe ; c’est ici que le duo et agit comme un scanner intelligent. La boucle parcourt la ligne mot par mot, de la gauche vers la droite, tandis que la condition interroge chaque mot pour savoir s’il correspond à notre point de repère “from“.
Dès que ce mot-clé est identifié, awk déduit logiquement que la cible (l’adresse IP) est le mot situé juste après et l’affiche grâce à , garantissant ainsi une extraction de l’adresse IP peu importe la longueur du message de log.
Désormais, les adresses IP sont isolées, puisque cette commande retourne ceci :
3 – Trier les données
Pour que la commande suivante de notre chaine fonctionne correctement (la commande ), les données identiques doivent être adjacentes. Grâce à l’utilisation de , nous allons pouvoir regrouper toutes les adresses IP identiques (c’est-à-dire à la suite dans la liste).
Désormais, nous obtenons :
4 – Compter les valeurs
Grâce à la commande , nous allons supprimer les doublons, mais en appelant cette commande avec l’option (count), un préfixe indiquant combien de fois chaque ligne apparaît est ajouté.
Nous obtenons ce résultat :
5 – Le classement final
La dernière étape consiste à appeler une nouvelle fois la commande sort, mais cette fois-ci simplement pour trier le résultat final. L’idée étant d’appeler sort avec ces deux options :
- (numeric) : pour trier selon la valeur du nombre (et pas alphabétiquement).
- (reverse) : pour avoir les plus grosses valeurs (donc les adresses IP à l’origine du plus grand nombre de tentatives infructueuses) en haut de la liste.
Voici la commande complète :
Le résultat final (qui aurait pu être différent vis-à-vis de l’étape 4) :
Ainsi, nous savons que l’adresse IP a effectué 6 tentatives de connexion SSH en échec, tandis que l’adresse IP en comptabilise 3.
Analyser les logs avec un script awk
Dans l’exemple précédent, nous avons analysé les journaux SSH en couplant awk à deux autres commandes. Sachez que c’était facultatif : awk peut se débrouiller seul. Néanmoins, la méthode précédente offre l’avantage de tenir sur une seule ligne, là où ce sera plus complexe et différent avec awk seul.
C’est l’occasion d’évoquer l’option d’awk, car je vous rappelle qu’elle permet de stocker le programme dans un fichier externe (ainsi la logique de traitement s’y trouvera). Nous n’aurons donc pas besoin de charger le terminal, et cela permet aussi de garder de côté le fichier pour le réutiliser.
Créez le fichier , puis ajoutez ce contenu :
Cet exemple fait usage des tableaux associatifs avec Awk. Ils sont très puissants pour regrouper et compter des éléments afin de faciliter l’analyse de données brutes. Contrairement aux langages classiques où les tableaux sont indexés par des numéros (0, 1, 2…), Awk utilise des tableaux associatifs, ce qui signifie que l’index (la clé) peut être du texte, comme une adresse IP, un nom d’utilisateur ou une URL. Dans cet exemple, la clé est , d’où la déclaration du tableau via .
Enregistrez et fermez ce fichier.
Puis, appelez ce fichier avec awk :
Ainsi, la commande n’est pas lourde à lire, le programme étant externalisé dans un fichier. De plus, grâce à l’utilisation du bloc , nous avons même le luxe d’ajouter des en-têtes avant de passer au comptage des tentatives par IP.
Voici le résultat obtenu dans le Terminal :

Filtrage avec les expressions régulières
Les expressions régulières (Regex) apportent une grande souplesse dans le filtrage, que ce soit avec Awk ou tous les autres outils et langages capables de les interpréter. L’idée étant de rechercher des motifs (patterns) plutôt que des valeurs exactes.
La commande ci-dessous scanne le fichier CSV pour afficher intégralement () toutes les lignes contenant le texte . Elle agit comme un filtre de recherche global, ne retenant et n’affichant que les entrées où cette valeur apparaît, quelle que soit la colonne concernée. Ce qui n’est pas sans rappeler ce que permet de faire .
L’expression régulière est inscrite entre deux slash :
Dans Awk, on utilise l’opérateur (tilde) pour appliquer la regex à une colonne et vérifier qu’elle correspond à une règle définie entre slashs. Ici, nous cherchons toutes les lignes où la colonne 1 () commence par la lettre . Si c’est le cas, la ligne est affichée entièrement.
Analyser les journaux Apache2 avec Awk
La commande ci-dessous sert à afficher les logs d’Apache2 en temps réel, tout en formatant la sortie de façon à afficher uniquement deux informations : l’adresse IP source et la page de destination. Les requêtes pour charger les ressources (images, CSS, JS) sont également exclues grâce à une expression régulière.
Cette commande retourne une sortie similaire à celle-ci :
Filtrage de processus par utilisateur
Si vous souhaitez lister les processus lancés par un utilisateur spécifique (disons ) mais n’afficher que le PID et la commande, vous pouvez compter sur Awk. L’idée étant de voir que cet outil est utile pour filter et formater la sortie des commandes habituelles.
Afficher la liste des adresses IP avec Awk
La commande sert à afficher la configuration IP d’une machine sous Debian ou Ubuntu. Elle fournit la liste des adresses IP configurées, en plus d’autres informations. Comment utiliser Awk pour épurer la sortie de cette commande pour conserver uniquement les adresses IP ? La réponse ci-dessous.
Pour comprendre cette commande, il faut regarder la structure de la sortie de la commande . Ci-dessous, j’ai mis en évidence la ligne qui nous intéresse. Étant donné qu’Awk traite les lignes une par une, elles seront traitées de façon indépendante.
Nous avons donc le filtre . Cette condition permet de sélectionner uniquement les lignes IPv4 et d’ignorer les lignes IPv6 (qui commencent par ) ou les autres lignes comme celles pour l’adresse MAC ().
L’action appliquée est , car une fois la bonne ligne trouvée, on affiche simplement le 2ème champ, qui correspond toujours à l’adresse IP suivie de son masque. Le premier champ étant la valeur en elle-même.
Conclusion
La commande est un pilier de l’administration système sous Linux. Elle intègre un langage capable de réaliser des actions diverses et variées, que ce soit des opérations arithmétiques, de manipuler des chaînes de caractères ou de filtrer finement des données.
Sa maîtrise permet de gagner en efficacité dans la rédaction de scripts, en particulier pour l’automatisation de tâches. Si vous couplez avec d’autres outils comme , ou , vous disposez d’un arsenal puissant pour traiter les données directement dans votre terminal.
FAQ – Awk
Quelle est la différence entre awk et sed ?
La commande est principalement utilisée pour la modification de texte (chercher/remplacer) sur des flux, tandis que est conçu pour le traitement de données structurées (colonnes).
Avec sed, vous pouvez effectuer une action de type “chercher et remplacer” dans un fichier, alors que ce n’est pas la vocation première d’awk. Malgré tout, awk en est capable via l’utilisation des fonctions pour remplacer la première occurrence et pour remplacer toutes les occurrences.
Comment utiliser un séparateur différent de l’espace ?
Utilisez l’option suivie du caractère. Pour un CSV dont le séparateur est la virgule, utilisez . L’alternative consiste à utiliser le bloc spécial afin de préciser le séparateur via le paramètre .
Comment afficher uniquement la dernière colonne d’un fichier ?
Utilisez la variable car elle est conçue pour afficher le dernier champ (attention au séparateur utilisé) : .
Comment passer une variable shell externe à awk ?
Utilisez l’option . Par exemple : .
Comment compter le nombre de caractères sur chaque ligne ?
Utilisez la fonction intégrée à Awk. Exemple : . Cette commande retournera seulement le nombre de caractères pour chaque ligne du fichier analysé.
Peut-on traiter plusieurs fichiers à la fois avec awk ?
Oui, spécifiez simplement les noms des fichiers à traiter à la suite : . Quand la commande sera exécutée, Awk les traitera séquentiellement.
Awk peut-il modifier directement un fichier ?
Oui, c’est tout à fait possible en utilisant ou , selon si vous souhaitez remplacer la première occurrence uniquement ou toutes les occurrences. Mais, ces fonctions seules ne suffisent pas : awk va ajuster la sortie pour appliquer la fonction, mais cela n’écrira pas dans le fichier cible. Il faut donc ajouter en complément. Attention, une mauvaise manipulation peut avoir un effet irréversible sur les données de votre fichier. Voici un exemple pour remplacer toutes les occurrences d’un mot par un autre dans un fichier :