Présentation |
![]() |
![]() |
La commande awk |
awk est une commande très puissante, c'est un langage de programmation a elle tout seule qui permet une recherche de chaînes et l'exécution d'actions sur les lignes sélectionnées. Elle est utile pour récuperer de l'information, générer des rapports, transformer des données entre autres.
Une grande partie de la syntaxe a été empruntée au langage c, d'ailleurs awk sont les abréviations de ces 3 créateurs dont k pour Kernighan, un des inventeurs du c.
La syntaxe de awk est la suivante:
awk [-F] [-v var=valeur] 'programme' fichier |
ou |
awk [-F] [-v var=valeur] -f fichier-config fichier |
L'argument -F doit être suivi du séparateur de champ (-F: pour un ":" comme séparateur de champ.
L'argument -f suivi du nom du fichier de configuration de awk.
L'argument -v définit une variable (var dans l'exemple) qui sera utilisée par la suite dans le programme.
Un programme awk possède la structure suivante: critère de sélection d'une chaîne {action}, quand il n'y a pas de critère c'est que l'action s'applique à toutes les lignes du fichier.
Exemple:
awk -F":" '{print $NF}' /etc/passwd
Il n'y a pas de critères, donc l'action s'applique à toutes les lignes du fichier /etc/passwd. L'action consiste à afficher le nombre de champ du fichier. NF est une variable prédéfinie d'awk, elle est égale au nombre de champs dans une ligne.
Généralement on utilisera awk en utilisant un script.
#!/bin/sh |
awk [-F] [-v var=valeur] |
'programme' |
$1 |
Vous appelerez votre script mon-script.awk, lui donnerez des droits en exécution (755 par exemple), et l'appelerez ainsi: mon-script.awk fichier-a-traiter
Dans la suite du cours, on utilisera awk en sous entendant que celui-ci est à insérer dans un script.
Le quote ' se trouve sur un clavier azerty standard avec le 4 et éventuellement l'accolade gauche.
ATTENTION: ils existent plusieurs "variétés" de awk, il se pourrait que certaines fonctions ou variables systèmes qui vous sont présentées dans ce cours n'existent pas sur votre UNIX. Faites en sorte si vos scripts awk doivent fonctionner sur des plates-formes différentes d'utiliser awk POSIX.
J'ai constaté des grosses différences de comportement entre le awk qu'on trouve sous HP-UX et Solaris et celui sous LINUX, je trouve ce dernier assez foireux, il ne se comporte pas comme il devrait se comporter, est-ce un bug ou moi qu'il oublie une certaine option de compatibilité, je n'ai pas encore fouillé suffisamment la chose pour en tirer une quelconque leçon.
Quand on insère la commande dans un script, on fait appel à un shell, ça marche très bien pour le born shell (/bin/sh), le korn shell (/bin/ksh), ou le bash shell sous Linux (/bin/bash), par contre pour une raison que je ne m'explique pas encore, ça marche pas très bien pour le c-shell (/bin/csh). C'est encore un point que je compte fouiller.
Si vous avez des idées sur ces deux dernières interrogations, je suis preneur...
awk scinde les données d'entrée en enregistrements et les enregistrements en champ. Un enregistrement est une chaîne d'entrée délimitée par un retour chariot, un champ est une chaîne délimitée par un espace dans un enregistrement.
Par exemple si le fichier à traiter est /etc/passwd, le caractère de séparation étant ":", un enregistrement est une ligne du fichier, et un champ correspond au chaîne de caractère séparé par un ":" (login:mot de passe crypté:UID:GID:commentaires:home directory:shell).
Dans un enregistrement les champs sont référencés par $1, $2, ..., $NF (dernier champ). Par exemple pour /etc/passwd $1 correspond au login, $2 au mot de passe crypté, $3 à l'UID, et $NF (ou $7) au shell.
L'enregistrement complet (une ligne d'un fichier) est référencé par $0.
Par exemple, si l'on veut voir les champs login et home directory de /etc/passwd, on tapera:
awk -F":" '{print $1,$6}' /etc/passwd