Introduction à awk

awk

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

jean;dupont;05;Paris;22
laurent;calu;05;Nantes;88

La commande awk suivante awk -F; '{print $2}' monfichier.csv va me fournir ce résultat :

dupont
calu

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 :

BEGIN { action effectuée toujours en premier}
$5 < 50 { action 1}
/dupont/ { action 2}
/nt/ && $3 == 05 { action 3}
{ action 4}
END { action effectuée toujours en dernier }

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

#!/usr/bin/awk -f
BEGIN {
print "début du script"
maVariable=5
nbLignes=0
nbCommentaires=0
nbCommentaires2=0
print "maVariable vaut " maVariable
}
( /^#/ || /^$/ ) {
nbCommentaires++
}
{
nbLignes++
printf "%04d:%s\n",FNR,$0
if ( $0 ~ /^#/ || $0 ~ /^$/ ) {
nbCommentaires2++
}
}
END {
print "fin du script maVariable vaut toujours " maVariable
print "Le script a traité " FNR " lignes dont " nbCommentaires "(=" nbCommentaires2 ") lignes vides ou commençant par un #"
}

 

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

début du script
maVariable vaut 5
0001:# Ce script affiche hello world
0002:
0003:echo "hello world"
0004:exit 0
fin du script maVariable vaut toujours 5
Le script a traité 4 lignes dont 2(=2) lignes vides ou commençant par un #

Voilà, vous n'avez plus qu'à vous lancer.

Enregistrer

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.