Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
En pratique : Utilisation de GAwk
(Article écrit par Pascal Amiable et extrait d'Amiga News Tech - novembre 1991)
|
|
Nous entamons ici une nouvelle série dont le but est de vous initier à l'utilisation de programmes compatibles
Unix et de vous faire découvrir un certain nombre d'utilitaires du domaine public qui de par leur qualité,
valent bon nombre de produits du commerce.
Nous allons commencer ce mois-ci par GAwk (abréviation de GNU Awk), un langage de traitement de fichiers
ASCII. C'est l'aboutissement de la réécriture de l'utilitaire Unix Awk dans le cadre du projet GNU
(d'où son nom de GAwk), projet visant à améliorer les fonctionnalités et la portabilité des commandes Unix
sur d'autres systèmes d'exploitation, tout en restant compatible avec les anciennes.
Le langage Awk a été écrit à l'origine par trois célèbres acteurs du monde Unix, à savoir Aho, Weinberger et
Kernighan (vous savez, un des papas du C). GAwk est compatible avec la version System V release 4 d'Unix.
Fonctions et syntaxe
La documentation Unix officielle décrit la fonctionnalité de Awk (et par extension de GAwk) comme
une commande permettant de réaliser des recherches sur des lignes spécifiques d'un fichier ASCII
et d'effectuer des traitements en fonction du résultat de ces recherches.
Pour expliquer un peu plus cette définition, je dirais que GAwk est un logiciel de traitement des
chaînes de caractères d'un fichier ASCII, plus puissant que grep, dans la mesure où il autorise
la réalisation de traitements sur ces chaînes de caractères là où grep se contente de les visualiser.
Les différentes fonctionnalités de GAwk sont :
- Traitement de données numériques.
- Utilisation de variables et de tableaux unidimensionnels.
- Contrôle des flots de données d'entrée.
- La sélection et utilisation de motifs ("pattern" en anglais) de recherche.
- Besoin d'aucun compilateur d'aucune sorte pour l'analyse des traitements à effectuer.
GAwk lit chaque fichier d'entrée dans l'ordre indiqué lors du passage de la commande (Cf. description de la
syntaxe ci-dessous). Si le nom du fichier est "-" où s'il n'existe aucun nom de fichier alors GAwk
lit l'entrée standard (typiquement l'entrée clavier).
Voyons de manière rapide comment cela fonctionne. La commande GAwk travaille ligne par ligne. Pour
chaque ligne, elle cherche à détecter la correspondance entre la ligne et la liste des motifs
définis par l'utilisateur. Quand elle trouve l'occurrence d'un motif dans la ligne, elle exécute
l'action associée à ce motif et renvoie le résultat sur la sortie standard (par défaut l'écran).
La syntaxe de la commande telle qu'elle est décrite dans le manuel est la suivante :
GAwk [-F caractère] [-f Programme] [--] [fichier...]
|
- "caractère" permet d'indiquer le caractère séparateur de champs.
- "programme" indique le nom du programme Awk à exécuter.
- "--" indique" la fin des options. Ceci est très utile pour autoriser les noms des arguments des programmes
sources à commencer par le caractère "-".
- "fichier" correspond à la liste des fichiers à traiter.
Langage ou pas langage
GAwk ressemble plus à un véritable langage qu'à un simple utilitaire dans la mesure où l'on est amené
à programmer des actions précises devant survenir si certaines conditions sont réunies, et ce
à l'aide d'un langage structuré basé sur le couple motif/actions. Pour nous en persuader, voyons plus
en détails le mécanisme de traitement de GAwk et la manière dont on peut le programmer.
GAwk commence par lire et contrôler la syntaxe de toutes les paires "motif/actions" du programme.
Si aucune erreur de syntaxe n'est détectée, il transforme le programme en une série d'instructions
internes (aucun résultat de cette pseudo-compilation ne sort de la commande). A ce moment, le traitement
ligne par ligne des fichiers spécifiés peut commencer.
GAwk lit une ligne du fichier d'entrée et la compare à chaque motif du programme, effectuant l'action
associée dans le cas où le test de comparaison est vrai. Il passe ensuite à la prochaine ligne, et
continue ainsi jusqu'à la dernière du dernier fichier d'entrée.
La commande GAwk considère chaque ligne du fichier d'entrée comme une suite de champs séparés par un
caractère particulier et se terminant par une fin de ligne. Par défaut, le caractère servant de séparateur
entre deux champs est le caractère "Espace". Il est toutefois possible de le changer par celui de votre choix.
En effet, ce séparateur est contenu dans une variable spéciale FS (Field Separator). Pour changer de séparateur,
il vous suffit d'affecter à FS autre chose que le blanc " ". Ainsi, l'instruction GAwk...
...définit le point comme séparateur.
Un séparateur peut également être une chaîne de caractères avec ou sans motif(s) de sélection. Chaque
champ de la ligne est stocké à la lecture dans une variable. Pour accéder à un champ particulier, il
faut donc lire la variable correspondante. Ce sont les variables $1 pour le premier champ, $2 pour le
deuxième et ainsi de suite jusques $99, qui est le maximum autorisé. A noter que pour accéder à l'ensemble
des champs on utilisera la variable $0. Par exemple, l'affectation de '2' au troisième champ d'une
ligne deviendra :
Parlons maintenant plus en détails de la syntaxe du langage. Comme je vous l'ai dit, l'élément de base
du langage est la séquence motif/actions. Il est toutefois possible de se passer de l'un de ces deux éléments :
s'il n'y a pas de motif, on effectue l'action sur toutes les lignes du fichier, et s'il n'y a pas d'action,
GAwk se contente d'écrire la ligne complète sur la sortie standard.
Une action au sens de GAwk est une suite d'instructions régies par les mêmes règles syntaxiques que le C.
Voici un détail des principaux ordres de GAwk.
Les variables
Pour être complet sur la description de GAwk, il nous faut voir maintenant les variables et la manière dont
elles sont gérées.
Les variables de GAwk sont purement dynamiques. C'est-à-dire qu'elles n'existent qu'à partir de leur première
assignation. Elles ne sont pas non plus typées dans le sens ou elle prennent le type de ce qu'on leur affecte.
Les valeurs qu'elles contiennent peuvent être réelles, entières ou de type chaîne de caractères. GAwk
gère les tableaux unidimensionnels seulement, mais il est très simple de simuler plusieurs dimensions par un
habile décalage d'indice. GAwk possède également bon nombre de variables réservées qu'il initialise et assigne
dynamiquement de manière transparente pour l'utilisateur. Passons en revue quelques-unes de ces variables
réservées du langage qui, vous allez pouvoir en juger, sont très utiles :
- FS : caractère indiquant la séparation de deux champs, par défaut il s'agit du caractère "Espace".
- NF : nombre de champs dans la ligne courante (abréviation anglaise de Number of Fields).
- NR : numéro de la ligne courante (abréviation anglaise de Number of Records).
- FNR : numéro de la ligne courante dans le fichier courant.
Petits exemples simples
Pour terminer cette étude du langage GAwk, nous allons voir quelques exemples des fonctionnalités et
de la puissance de traitement du langage.
Exemple 1 : ce premier exemple va permettre la visualisation de toutes les lignes d'un fichier
nommé toto, dont la taille est supérieure à 72 caractères. Cet exemple est des plus simples et ne
nécessite même pas d'écrire un programme complet ; on passera directement la commande sous la forme :
La fonction "length", lorsqu'elle ne possède pas de paramètres, renvoie la longueur de la ligne d'entrée.
Exemple 2 : cette fois on complique un peu. Nous allons visualiser toutes les lignes du fichier
"toto" comprises entre deux mots-clefs "start" et "stop". La commande à envoyer à GAwk pour faire le
traitement est donc la suivante :
GAwk '/start/, /stop/' toto
|
L'indication d'une chaîne de caractères se fait en la limitant par deux barres obliques.
Exemple 3 : nous allons maintenant réaliser notre premier vrai programme, que nous appellerons
"somme.awk". Il traite un fichier "toto" en additionnant tous les nombres correspondant à la deuxième colonne
de chaque ligne du fichier. Voici le fichier d'exemple :
Le programme à réaliser est donc le suivant :
La première action ajoute la valeur du second champ de chaque ligne à la variable somme. Le mot
clé "END", situé avant la deuxième action, indique qu'elle ne devra être exécutée qu'après que toutes
les lignes de tous les fichiers d'entrée aient été traitées par la première. Enfin, "NR"
est la variable réservée contenant le nombre total de lignes lues.
Exemple 4 : pour notre dernier exemple, nous allons inverser les colonnes du fichier "toto",
c'est-à-dire inverser les champs de chaque ligne. Le programme est très simple, le voici :
awk '{print $3, $2, $1 }' titi
|
Voilà pour les exemples, il ne nous reste plus qu'à savoir où trouver le logiciel.
Où trouver GAWK ?
GAwk est disponible, vous vous en doutez bien, dans le domaine public. La version que j'ai testée
se trouve sur la disquette Fish numéro 406.
Outre le programme proprement dit, vous trouverez également une documentation (en anglais) dans
le plus pur style "man" d'Unix, ainsi qu'un certain nombre de fichiers textes expliquant le travail
des auteurs. Pour ceux qui voudraient en savoir plus sur Awk, je vous conseille la "bible" de ce langage :
The Awk Programming Language, écrit par les trois auteurs d'Awk eux-mêmes et édité par Bell
Telephone Laboratories, Incorporated.
En conclusion, je vous recommande fortement d'étudier ce petit langage de traitement de fichiers ASCII
qu'est GAwk.
|