Comment utiliser la commande awk sous Linux



Sous Linux, awk se distingue comme un outil polyvalent de traitement de texte en ligne de commande, tout en étant un langage de script puissant. Examinons certaines de ses fonctionnalités les plus remarquables.

L’origine du nom awk

La commande awk doit son nom aux initiales des trois créateurs de la version originale en 1977 : Alfred Aho, Peter Weinberger et Brian Kernighan. Ces trois pionniers appartenaient au célèbre AT&T Bell Laboratories, véritable temple d’Unix. Grâce aux contributions de nombreux autres depuis, awk n’a cessé d’évoluer.

Il s’agit à la fois d’un langage de script complet et d’un ensemble d’outils de manipulation de texte pour la ligne de commande. Si vous êtes curieux d’en savoir plus, vous pouvez explorer tous les détails sur awk et ses nombreuses capacités.

Principes de fonctionnement: règles, modèles et actions

awk structure ses programmes en règles, elles-mêmes constituées de modèles et d’actions. L’action est exécutée lorsque le texte correspond au modèle. Les modèles sont délimités par des accolades ({}). Ensemble, un modèle et une action forment une règle. Le programme awk entier est placé entre guillemets simples (‘).

Étudions le type de programme awk le plus simple. Il ne comporte pas de modèle, ce qui signifie qu’il s’applique à chaque ligne de texte qui lui est transmise. En conséquence, l’action est exécutée sur chaque ligne. Prenons par exemple la sortie de la commande who.

Voici la sortie standard de who :

who

Supposons que nous n’ayons besoin que des noms de comptes. Nous pouvons rediriger la sortie de who vers awk et demander à awk d’afficher uniquement le premier champ.

Par défaut, awk considère un champ comme une séquence de caractères délimitée par des espaces, le début ou la fin d’une ligne. Les champs sont identifiés par le symbole dollar ($) suivi d’un nombre. Ainsi, $1 représente le premier champ. Nous allons utiliser cette notation avec l’action d’impression pour afficher le premier champ.

Nous saisissons la commande suivante :

who | awk '{print $1}'

awk affiche uniquement le premier champ et ignore le reste de la ligne.

Nous pouvons afficher autant de champs que nous le souhaitons. Si nous ajoutons une virgule comme séparateur, awk insérera un espace entre chaque champ.

Pour afficher également l’heure de connexion (quatrième champ), nous saisissons la commande suivante :

who | awk '{print $1,$4}'

Il existe quelques identificateurs de champs spéciaux. Ils permettent de représenter la ligne entière et le dernier champ de la ligne de texte :

$0 : représente la ligne entière de texte.
$1 : représente le premier champ.
$2 : représente le deuxième champ.
$7 : représente le septième champ.
$45 : représente le 45e champ.
$NF : signifie «nombre de champs» et représente le dernier champ.

Pour illustrer cela, créons un petit fichier texte contenant une courte citation attribuée à Dennis Ritchie :

cat dennis_ritchie.txt

Nous souhaitons qu’awk affiche le premier, le deuxième et le dernier champ de la citation. Notez que bien qu’elle soit affichée sur plusieurs lignes dans la fenêtre du terminal, elle ne forme qu’une seule ligne de texte.

Nous saisissons la commande suivante :

awk '{print $1,$2,$NF}' dennis_ritchie.txt

Nous ne connaissons pas le rang de « simplicité ». qui est le 18e champ, et nous n’en avons pas besoin. Nous savons simplement qu’il s’agit du dernier champ et que nous pouvons utiliser $NF pour récupérer sa valeur. Le point est simplement considéré comme un caractère additionnel du champ.