V. Structures de contrôle▲
V-A. Introduction▲
Le langage awk ne serait pas un langage complet si on ne pouvait agir sur le déroulement du script. Ainsi awk dispose de structures de contrôle.
Si vous avez déjà utilisé un langage comme le C, vous vous êtes déjà familiarisé avec les structures qui sont quasiment toutes les mêmes (avec des rajouts). Attention, les structures de contrôle ne peuvent être utilisées en tant que condition première (ou critère).
V-B. Les décisions▲
L'expression if permet l'exécution d'une ou plusieurs instructions en fonction de la réalisation de la condition. Une condition se définit avec les opérateurs logiques et de comparaisons (cf. chapitre précédent).
if
(condition)
instruction
Vous pouvez regrouper plusieurs instructions en utilisant les accolades. L'expression if peut être suivie d'une expression else qui sera réalisée si l'expression if échoue.
if
(condition)
{
instruction1
instruction2
}
else
{
instruction1
instruction2
}
V-C. Les boucles▲
V-C-1. Les boucles while▲
Awk dispose de deux types de boucles while. Voici leur syntaxe :
while
(condition)
{
instructions
}
do
{
instructions
}
while
(condition)
La boucle do-while exécute les instructions une fois avant de tester la condition. Par conséquent les instructions sont exécutées au moins une fois contrairement à la boucle while classique ou for.
V-C-2. Les boucles for▲
Comme pour les boucles while, il existe deux types de boucles for :
for
(instruction de début; condition; instruction de comptages)
{
instructions
}
for
(variable in
Tableau)
{
instructions
}
La première boucle for est la boucle classique présente dans de nombreux langages de programmation (C, Perl…). Elle peut être remplacée très facilement par une boucle while et inversement.
La seconde boucle est plus originale. Elle permet de parcourir un tableau associatif. Un tableau associatif peut être indexé par des chaînes de caractères. Il est donc beaucoup plus difficile de parcourir le tableau. Par conséquent, awk propose cette boucle (elle permet de parcourir n'importe quel tableau. Qu'il soit indexé par des nombres ou des caractères alphanumériques). Malheureusement, les valeurs ne seront pas triées. Mais il existe des méthodes pour trier que nous verrons plus tard.
V-D. Les sauts contrôlés▲
Les sauts contrôlés vont permettre d'interrompre un traitement. Cependant awk ne dispose pas d'instruction telle le goto. Elles rendent souvent le code confus. Cependant les sauts de contrôles permettront de remplacer avantageusement le goto.
V-D-1. Les contrôles de boucles▲
Dans cette catégorie, ce sont les mots clés break et continue qui sont utilisés :
- le break permet de sortir de la boucle active ;
- le mot clé continue permet de faire un nouveau passage dans la boucle (les instructions après continue ne seront pas prises en compte). Cependant le nouveau passage se fera si et seulement si la condition est remplie.
Il faut savoir qu'il n'y a pas de moyen de sortir de deux boucles imbriquées grâce à un seul break (ou de faire un continue). Ces mots clés ne fonctionnent que sur la boucle active.
V-D-2. Les contrôles du programme▲
Cette catégorie est composée des mots clés next et exit. Lorsque awk rencontre le mot clé next, il arrête le traitement de l'enregistrement en cours et il passe au suivant. Tandis que exit permet l'arrêt complet des traitements. Awk exécute tout de même les blocs END. (Si vous mettez un exit dans un bloc END, alors le programme s'arrête définitivement.)
V-E. Exemples▲
V-E-1. Le script PATH▲
Ce script permet de récupérer le chemin d'un fichier à partir d'un chemin complet (avec le fichier) :
#! /usr/bin/awk -f
BEGIN
{
FS
=
"/"
}
{
path=
""
for
(i =
1
; i <
(NF
); i++
) {
path =
path $i "/"
}
print
path
}
Voici le résultat :
nyal $ cat fichier_test
./
home/
nyal/
.xsession
./
home/
nyal/
.Xdefault
/
etc/
rc.d/
rc.modules
/
etc/
termcap
nyal $ cat fichier_test |
./
path.awk
./
home/
nyal/
./
home/
nyal/
/
etc/
rc.d/
/
etc/
V-E-2. le script STOCKAGE PASSWD▲
Ce script permet juste de montrer les possibilités des tableaux associatifs. Il stocke les utilisateurs du fichier passwd (/etc/paswd) avec son home (chemin du compte).
#! /usr/bin/awk -f
BEGIN
{
FS
=
":"
}
{
tabl_stock[$1] =
$6
}
END
{
for
(name in
tabl_stock) {
print
"Nom : "
name " | Home : "
tabl_stock[name]
}
}
V-E-3. Le script REVERSE LINE▲
Ce script permet de renverser les champs d'un enregistrement :
#! /usr/bin/awk -f
# ENTRE : Comment allez vous ?
# SORTIE : ? vous allez Comment
{
reverse=
""
i =
NF
while
(i >
0
) {
reverse =
reverse $i FS
i--
}
print
reverse
}