Introduction
Lorsque vous travaillez avec des données textuelles structurées sous Linux, comme des fichiers journaux, des fichiers CSV ou des fichiers de configuration, vous devez souvent extraire des colonnes précises. Vous pouvez par exemple vouloir récupérer uniquement les noms d’utilisateur d’un fichier système ou les codes d’état d’un journal d’accès web.
L’outil principal pour cette tâche est awk.
awk traite le texte comme une série d’enregistrements (lignes) et de champs (colonnes). C’est l’une des raisons pour lesquelles le texte brut reste si utile sous Linux : de nombreux formats de données administratives sont faciles à examiner à l’œil et à traiter avec les outils de la ligne de commande.
- Les enregistrements sont généralement séparés par des retours à la ligne.
- Les champs sont généralement séparés par des espaces ou des tabulations.
Ce modèle fondé sur les « enregistrements et les champs » constitue le cadre mental qui permet de comprendre awk plus facilement. Au lieu de considérer un fichier comme du texte brut, awk le considère comme un ensemble de lignes et de colonnes structurées auxquelles vous pouvez accéder directement.
Dans ce lab, vous apprendrez à utiliser awk pour :
- Sélectionner des champs : extraire des colonnes précises avec
$1,$2, etc. - Définir des séparateurs de champs : traiter des données séparées par d’autres caractères que des espaces, comme des deux-points ou des virgules, avec l’option
-F. - Accéder au dernier champ : récupérer dynamiquement la fin d’une ligne avec
$NF.
Extraire le premier champ
Commencez par un fichier simple dont les champs sont séparés par des espaces. Nous avons créé le fichier data.txt pour vous.
Affichez son contenu :
cat data.txt
Sortie :
John 25 Engineer
Alice 30 Manager
Bob 22 Intern
Pour awk, chaque ligne est un enregistrement et chaque mot est un champ :
- Champ 1 ($1) : nom (par exemple, John)
- Champ 2 ($2) : âge (par exemple, 25)
- Champ 3 ($3) : rôle (par exemple, Engineer)
Si vous voulez uniquement extraire les noms, c’est-à-dire la première colonne, demandez à awk d’afficher $1.
Dans awk, $1, $2 et les expressions similaires désignent les champs de l’enregistrement courant. $0 représente la ligne courante entière. Cette notation des champs explique notamment pourquoi awk est si concis pour traiter du texte structuré.
Exécutez la commande suivante :
awk '{print $1}' data.txt
Sortie :
John
Alice
Bob
Enregistrez maintenant cette sortie dans un fichier :
awk '{print $1}' data.txt > output1.txt
Vérifiez le contenu du nouveau fichier :
cat output1.txt
Comprendre la séparation des champs
Essayez maintenant un autre format de fichier : /etc/passwd. Ce fichier contient les informations des comptes utilisateur.
Affichez le début du fichier passwd :
head -n 3 /etc/passwd
La sortie ressemble à ceci : root:x:0:0:root:/root:/bin/bash
Vous remarquerez qu’il n’y a pas d’espaces. Les champs sont séparés par des deux-points (:).
Si vous exécutez la commande awk par défaut sur ce fichier, les champs ne seront pas séparés correctement, car awk attend des espaces par défaut.
Essayez :
awk '{print $1}' /etc/passwd > output2.txt
head -n 3 output2.txt
Vous constaterez que la commande affiche la ligne entière. Comme awk n’a trouvé aucun espace, il a considéré toute la ligne comme un seul champ ($1).
Pour corriger cela, vous devez indiquer un séparateur de champs personnalisé.
C’est une notion essentielle pour le traitement de texte dans des situations réelles : l’efficacité de l’outil dépend de votre compréhension du format des données. Si vous choisissez le mauvais séparateur, les colonnes que vous pensez extraire ne correspondent pas aux colonnes que awk identifie réellement.
Utiliser un séparateur de champs personnalisé (-F)
Pour transformer les données séparées par des deux-points en champs exploitables, utilisez l’option -F.
La commande awk -F: indique à awk d’utiliser le caractère deux-points comme séparateur entre les colonnes.
L’option -F modifie la manière dont awk analyse chaque ligne avant toute opération d’affichage ou de traitement. Une fois la ligne correctement séparée, les références de champs comme $1 et $7 redeviennent pertinentes.
Vous pouvez maintenant extraire des champs précis. Dans le fichier /etc/passwd :
- Le champ 1 correspond au nom d’utilisateur.
- Le champ 7 correspond au shell.
Extrayez uniquement le nom d’utilisateur et le shell. Vous pouvez afficher plusieurs champs en les séparant par une virgule.
awk -F: '{print $1, $7}' /etc/passwd > output3.txt
Vérifiez le résultat :
head -n 5 output3.txt
La sortie doit ressembler à ceci : root /bin/bash
awk a correctement séparé la ligne au niveau des deux-points, puis a affiché les premier et septième champs en les séparant par un espace dans la sortie.
Afficher le dernier champ ($NF)
Vous ne connaissez pas toujours exactement le nombre de colonnes d’une ligne, ou ce nombre peut varier. En revanche, vous savez parfois que les données recherchées se trouvent toujours dans la dernière colonne.
awk fournit une variable intégrée appelée $NF (Number of Fields).
NFcontient le nombre de champs de la ligne courante.$NFdésigne la valeur du dernier champ.
Cette variable est utile, car elle rend votre commande moins dépendante de numéros de colonnes codés en dur. Lorsque la position à partir de la fin est plus importante que le numéro de colonne absolu, NF et $NF offrent souvent davantage de souplesse.
Extrayez la dernière colonne de /etc/passwd avec $NF.
awk -F: '{print $NF}' /etc/passwd > output4.txt
Vérifiez la sortie :
head -n 5 output4.txt
La sortie doit à nouveau correspondre au shell, par exemple /bin/bash, comme avec $7, à condition que la structure du fichier soit cohérente. L’utilisation de $NF est souvent plus robuste, car elle s’adapte automatiquement à la fin de la ligne.
Résumé
Dans ce lab, vous avez appris les bases de l’analyse de texte avec awk :
- Extraction de champs (
$N) : accéder aux différentes colonnes de données avec$1,$2, etc. - Séparateurs de champs (
-F) : traiter des fichiers utilisant différents séparateurs, comme des deux-points ou des virgules, avec l’option-F. - Dernier champ (
$NF) : accéder dynamiquement à la dernière colonne d’un enregistrement.
Ces techniques vous permettent de transformer du texte brut et structuré en flux de données propres et exploitables pour un traitement ultérieur.



