Un guide pour le scriptage awk intermédiaire

Cet article explore les capacités d’awk, qui sont plus faciles à utiliser maintenant que vous savez comment structurer votre commande en un script exécutable.

Opérateurs logiques et conditionnels

Vous pouvez utiliser les opérateurs logiques et (écrit &&) et ou (écrit ||) pour ajouter de la spécificité à vos conditionnels.

Par exemple, pour sélectionner et imprimer uniquement les enregistrements ayant la chaîne « violet » dans la deuxième colonne et un montant inférieur à cinq dans la troisième colonne :

$2 == "purple" && $3 < 5 {print $1}

Si un enregistrement a « violet » dans la deuxième colonne mais une valeur supérieure ou égale à 5 dans la troisième colonne, alors il n’est pas sélectionné. De même, si un enregistrement correspond à l’exigence de la colonne trois mais qu’il manque « violet » dans la colonne deux, il n’est pas non plus sélectionné.

Disons que vous voulez sélectionner chaque enregistrement de votre fichier dont le montant est supérieur ou égal à huit et imprimer un enregistrement correspondant avec deux astérisques (**). Vous voulez également marquer chaque enregistrement dont la valeur est comprise entre cinq (inclus) et huit avec un seul astérisque (*). Il y a quelques façons de faire cela, et l’une d’entre elles consiste à utiliser la commande next pour indiquer à awk qu’après avoir effectué une action, il doit arrêter le balayage et passer à l’enregistrement suivant.

Voici un exemple :

NR == 1 {
print $0;
next;
}
$3 >= 8 {
printf "%s\t%s\n", $0, "**";
next;
}
$3 >= 5 {
printf "%s\t%s\n", $0, "*";
next;
}
$3 < 5 {
print $0;
}

Commande BEGIN

La commande BEGIN vous permet d’imprimer et de définir des variables avant qu’awk ne commence à balayer un fichier texte. Par exemple, vous pouvez définir les séparateurs de champs d’entrée et de sortie à l’intérieur de votre script awk en les définissant dans une instruction BEGIN. Cet exemple adapte le script simple de l’article précédent pour un fichier avec des champs délimités par des virgules au lieu d’espaces blancs :

Commande END

La commande END, comme BEGIN, vous permet d’effectuer des actions dans awk après qu’il ait terminé son balayage du fichier texte que vous traitez. Si vous voulez imprimer les résultats cumulatifs d’une certaine valeur dans tous les enregistrements, vous ne pouvez le faire qu’après que tous les enregistrements ont été balayés et traités.

Les commandes BEGIN et END ne s’exécutent qu’une fois chacune. Toutes les règles entre elles s’exécutent zéro fois ou plus sur chaque enregistrement. En d’autres termes, la majeure partie de votre script awk est une boucle qui est exécutée à chaque nouvelle ligne du fichier texte que vous traitez, à l’exception des règles BEGIN et END, qui s’exécutent avant et après la boucle.

Voici un exemple qui ne serait pas possible sans la commande END. Ce script accepte les valeurs de la sortie de la commande Unix df et incrémente deux variables personnalisées (utilisées et disponibles) à chaque nouvel enregistrement.

$1 != "tempfs" {
used += $3;
available += $4;
}
END {
printf "%d GiB used\n%d GiB available\n", used/2^20, available/2^20;
}

Enregistrez le script sous le nom total.awk et essayez-le :

df -l | awk -f total.awk

Les variables utilisées et disponibles se comportent comme les variables de nombreux autres langages de programmation. Vous les créez arbitrairement et sans déclarer leur type, et vous leur ajoutez des valeurs à volonté. À la fin de la boucle, le script additionne les enregistrements dans les colonnes respectives et imprime les totaux.

Math

Comme vous pouvez probablement le dire à partir de tous les opérateurs logiques et des calculs occasionnels jusqu’ici, awk fait des maths assez naturellement. Cela en fait sans doute une calculatrice très utile pour votre terminal. Au lieu de s’efforcer de se souvenir de la syntaxe plutôt inhabituelle de bc, vous pouvez simplement utiliser awk ainsi que sa fonction spéciale BEGIN pour éviter l’exigence d’un argument de fichier :

$ awk 'BEGIN { print 2*21 }'
42
$ awk 'BEGIN {print 8*log(4) }'
11.0904

Admettre que c’est encore beaucoup de frappe pour des maths simples (et pas si simples), mais cela ne demanderait pas beaucoup d’efforts pour écrire un frontal, ce qui est un exercice à explorer pour vous.

Cet article est adapté d’un épisode de Hacker Public Radio, un podcast technologique communautaire.

Laisser un commentaire

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