Awk est un langage de traitement de lignes, disponible sur la plupart des systèmes Unix.
Il est principalement utilisé pour la manipulation de fichiers textuels pour des opérations de recherche, de remplacement et de transformation complexe.
La syntaxe d'appel d'une commande awk est la suivante :
awk [options] [programme] [fichier]
La commande awk dispose de plusieurs options dont celles-ci parmi les plus utilisées :
- -F séparateur. Permet de spécifier le caractère séparateur de champ (par défaut espace)
- -f fichier. Permet de spécifier un fichier contenant le programme awk à exécuter.
- -v variableAwk=$variableShell. Permet de passer facilement une variable du script shell à notre programme awk
Principe de fonctionnement
Lorsque l'on exécute une commande awk, le fichier passé en paramètre sera parcouru ligne par ligne.
Chaque ligne de ce fichier sera interprétée par les blocs de commandes contenus dans le bloc du programme awk.
L'interprétation est séquentielle dans l'ordre des lignes du fichier fourni.
Grâce à la définition du séparateur de champs, awk est capable de découper chaque ligne en variables que l'on pourra utiliser dans nos blocs de programme.
Exemple
Avec le contenu de ce fichier
La commande awk suivante awk -F; '{print $2}' monfichier.csv
va me fournir ce résultat :
Description du bloc programme
Le bloc programme contient une série de blocs d'instructions contenant une condition et une action
Condition { Action }
...
Condition { Action }
Chaque bloc d'instruction est interprété dans l'ordre séquentiel de présence dans le bloc de programme.
Si la condition est validée, alors l'action est exécutée.
L'accolade ouvrante ({) doit se situer sur la même ligne que la condition.
Les conditions
Elles peuvent être de plusieurs types :
- un expression régulière - /expression régulière/
- BEGIN ou END
- une expression de comparaison: <, <=, == , !=, >=, >
- une combinaison des trois (à l'aide des opérateurs booléens || ou, && et, ! négation)
- aucune condition.
exemples :
Les blocs d'instructions dont la condition est BEGIN seront toujours interprétés en début de traitement AVANT le parcours du fichier fourni en paramètre.
Les blocs d'instructions dont la condition est END seront toujours interprétés en début de traitement APRES le parcours du fichier fourni en paramètre.
Les blocs d'instructions peuvent ne pas avoir de condition et seront interprétés à chaque ligne du fichier fourni en paramètre.
Les actions
Les actions permettent de transformer ou de manipuler les données, elles contiennent une ou plusieurs instructions. Les actions peuvent être de différents types:
- fonctions prédéfinies
- fonctions de contrôle
- fonctions d'affectation
- fonctions d'affichage
Fonctions prédéfinies
Il existe des fonctions prédéfinies concernant les numériques (atan(), log(), cos(), ...), concernant les chaînes de caractères (substr(), length(), printf(), ...), et d'autres encore.
Se référer à la manpage (man awk
) de votre système pour avoir une liste complète de ces fonctions.
Fonctions de contrôle
Awk étant issus du langage C, il dispose de toutes les fonctions de contrôle de ce langage :
- if, else.
- while, for, do-while
- break, continue, next, exit
Fonctions d'affectation
Dans une action, on peux manipuler des variables simplement. Par exemple :
i=11 ou i = j++
Variables prédéfinies
Awk nous fourni un certain nombre de variables prédéfinies que l'on peut manipuler dans nos actions.
Voici les plus utilisées :
ARGC nombre d'arguments de la ligne de commande
ARGV tableau des arguments de la ligne de commande
FILENAME nom du fichier d'entrée néant
FS contrôle le séparateur des champs d'entrée
IGNORECASE contrôle les expressions régulières et les opérations sur les chaînes de caractères
RS contrôle le séparateur des enregistrements d'entrée
NF nombre de champs dans l'enregistrement courant
NR nombre d'enregistrements lus jusqu'alors
OFS séparateur des champs de sortie
ORS séparateur des enregistrements de sortie
Se référer à la manpage (man awk
) de votre système pour avoir une liste complète.
Exemple de script complet
Explications
- Le bloc BEGIN est exécuté une fois au début, avant le traitement des données. Il affiche "début du script", initialise les variables et affiche le contenu de maVariable.
- Un bloc qui est exécuté pour chaque ligne commençant par un # ou vide, il incrémente la variable nbCommentaires.
- Un Bloc exécuté pour toutes les lignes, il incrémente la variable nbLignes, affiche la ligne préfixée par son numéro. Le numéro est formaté pour occuper quatre caractères. Les lignes suivantes (à partir du if) montrent l'équivalence entre le bloc du dessus et un test if dans le bloc principal. La variable nbCommentaires2 est incrémentée pour chaque ligne commençant par un # ou vide.
- Le bloc END est exécuté une fois à la fin, après le traitement des données. On voit que la variable maVariable est toujours définie et que son contenu n'a pas été altéré. Il indique également le nombre total de lignes traitées et le nombre de lignes de commentaires ou vides présentes dans le fichier.
Sortie console
Voilà, vous n'avez plus qu'à vous lancer.