![]() |
guill.net
-
La page des réseaux
|
![]() ![]() |
La commande awk
Cette section ne s'adresse qu'aux plus rapides!
Présentation
Cette commande permet d'appliquer un certain nombre d'actions sur un fichier. La syntaxe est inspirée du C. L'utilitaire awk emprunte son nom à l'identité de ses trois auteurs (Aho, Weinberger et Kernighan). Il s'agit d'un véritable langage permettant l'écriture de filtres. En effet, il permet d'extraire parmi les lignes d'un fichier des informations sélectionnées et offre la possibilité de réaliser des comparaisons et des calculs sur des champs et de réorganiser les lignes. Il permet l'écriture rapide de tels filtres pour exploiter les résulats de programmes et ne nécessite aucune compilation.
Généralités
La syntaxe de la commande est la suivante:
awk [-F] car [-f ref_prog] [ref...]
Un fichier soumis à un programme awk est découpé en enregistrements logiques (par défaut des lignes) eux mêmes découpés en champs. Un enregistrement (respectivement un champ) est une suite de caractères consécutifs délimitée par un caractère distingué (un délimiteur) qui, par défaut est le caractère de fin de ligne (respectivement un caractère d'espacement <SPACE>) De façon générale, $1, $2, ... désignent le premier champ, le second champ, ... de l'enregistrement courant et $0 cet enregistrement en totalité.
Voyons un petit exemple:
créez le fichier eleves.txt suivant:
BOBY
18 5
ZELYNOU
6 11
ANTIN
8 4
BOB
16 8 15
IZEL
16 18 12
Créez le fichier awk.prg
suivant:
{ print $1 " moyenne
" ($2 +$3)/2 }
Enfin, lancez la commande
suivante et voyez le résultat :
awk -f awk.prg eleves.txt
Explication: le traitement de chaque ligne se fait par une commande écrite entre accolades { et } . A présent, modifiez le fichier awk.prg comme suit et testez à nouveau par awk -f awk.prg eleves.txt (les commentaires sont précédés d'un #).
Awk met à la disposition
du programmeur des variables:
nom de la variable | résultat |
NF | nombre de champs de l'enregistrement courant |
NR | numéro de l'enregistrement en cours de traitement, |
en particulier NR aura comme valeur tout à la fin | |
le nombre total d'enregistrements | |
FILENAME | nom du fichier ouvert |
Awk met à la disposition
du programmeur un nombre considérable de fonctions dont voici
un extrait des plus utiles :
nom de la fonction | résultat |
length(s) | retourne la longueur de la chaine s |
index(s1,s2) | donne la position de la première occurence de s2 dans s1. |
La valeur est 0 si il n'y a aucune occurence | |
gsub(r,s,t) | sur la chaine t, remplace toutes les occurences de r par s |
sub(r,s,t) | comme gsub, mais remplace uniquement la première occurence |
substr(s,i,n) | retourne la sous chaine de s commençant en i et de taille n |
Exercice: écrire un
fichier awk.prg qui permettra d'obtenir le résultat suivant
à partir du fichier eleves.txt (le rôle de ce filtre
est de remplacer toute lettre ``Z'' par la lettre ``a'' :
BOBY
18 5
aELYNOU
6 11
ANTIN
8 4
BOB
16 8 15
IaEL
16 18 12
Awk dispose enfin d'instructions :
Awk initialise automatiquement les variables. Ainsi i est automatiquement initialisé à 0 au départ.
A présent, il ne nous reste plus qu'à revoir les expressions régulières ainsi que la syntaxe générale d'un fichier awk et nous pourrons dès lors écrire pratiquement n'importe quelle commande du type awk.
Rappels: les expressions régulières
Une expression régulière est une chaîne de caractère définie par des caractères, des répétititions de caractères ou des positions de caractères. Après les caractères, on peut mettre
On dispose aussi des symboles :
La forme générale des programmes transmis à awk
Pour simplifier, un programme ou un filtre awk est divisé en trois sections, (don't panic, un exemple suivra):
Exemple 1 qui n'utilise pas de motifs:
END {
printf ("Votre fichier contient
%d lignes",NR)
{}
Exemple 2:
BEGIN {
printf ("Affichage des lignes
du fichier %s contenant du texte en majuscules
antislash_n",FILENAME)
}
Exercices
Recherche d'une chaîne de caractères
Ecrire un filtre awk1.prg
qui affiche toutes les lignes du fichier eleves.txt qui contiennent la
chaîne BO
Solution
Numérotation des lignes d'un fichier
Ecrire un filtre awk2.prg
qui numérote toutes les lignes du fichier eleves.txt. Le résultat
de l'exécution sera de la forme:
1 BOBY
18 5
2 ZELYNOU
6 11
3 ANTIN
8 4
4 BOB
16 8 15
5 IZEL
16 18 12
Solution
Recherche d'une chaîne de caractères particulière
Ecrire un filtre awk3.prg
qui affiche toutes les lignes du fichier eleves.txt qui contiennent une
lettre ``E'' suivie d'un nombre quelconque de lettres puis impérativement
le chiffre 1
Solution
Pour clore sur awk
Motifs
L'expression / motif / { actions } n'est pas la seule possible pour engendrer une action. On peut faire des choses du type:
De la puissance de awk
Si les exemples que nous avons vus sont relativement succincts, il faut bien comprendre que awk est en fait une commande très puissante qui est d'ailleurs très utilisée par l'un de nos administrateurs système dans la maison (parlez-lui de Linux ou de awk, ça lui fera plaisir ;-) )
Voici un exemple succint pour contrôler que tous les enregistrements d'un fichier ont le même nombre de champs que le premier enregistrement. Faites un copier coller du programme qui suit et testez le par:
awk -f awk.prg -F ":" /etc/passwd
Au terme de ce bureau d'étude, vous êtes donc opérationnel sous UNIX. Si vous êtes amenés dans la suite de votre cursus à manipuler des commandes inconnues vous pouvez toujours faire un man nom_commande ou encore consulter la bible de la programmation UNIX :