Menu Fermer

AWK : Utilisation et exemples fonctions, opérateurs et boucles

AWK est une commande Linux puissante de Linux et UNIX pour le traitement de texte.
C’est aussi un langage de script à part entière.
Pour cela, il propose une multitude de fonctions, opérateurs et même la possibilité de faire des boucles.

Dans ce tutoriel, je vous présente la plupart des fonctions, opérateurs et boucles AWK et leurs utilisations à travers des exemples.

AWK : Utilisation et exemples fonctions, opérateurs et boucles

Les déclaration et boucles avec AWK

if-else

if-else permet d’évaluer des expressions, si l’expression if est vrai, l’action est exécuté sinon else est exécuté.

Par exemple ci-dessous on parcourt le fichier employes.csv et on compare la colonne 2 et 3.
Si la colonne 2 est 3 sont identiques alors cela affiche leur valeur sinon le message Pas de colonnes dupliquées s’affiche.

awk -F ',' '{if($2==$3){print $1","$2","$3} else {print $2 " Pas de colonnes dupliquées"}}' employes.csv

On peut aussi utiliser if else avec plusieurs instructions ou expressions grâce aux opérateurs logiques.
Par exemple si dessus, on teste si les colonnes 1 et 2 ET les colonnes 3 est 4 sont identiques.
IF retourne vrai seulement si les deux groupes de colonnes sont identiques en même temps.

awk -F ',' '{if($1==$2 && $3==$4){print $1","$2","$3} else {print $2 " Pas de colonnes dupliquées"}}' employes.csv

for

La boucle for s’exécute un certains nombres de fois que l’on l’expression est vrai.
En général, il s’agit d’incrémenter ou décrémenter un compteur.

awk 'BEGIN { for (i = 1; i <= 10; ++i) print "La somme de", i, "est", i*2; ++i }'
La somme de 1 est 2
La somme de 2 est 4
La somme de 3 est 6
La somme de 4 est 8
La somme de 5 est 10
La somme de 6 est 12
La somme de 7 est 14
La somme de 8 est 16
La somme de 9 est 18
La somme de 10 est 20

while

La boucle while est une boucle qui continue de s’exécuter tant que l’expression testée est vraie.

Par exemple ci-dessous, on calcule la somme des 10 premiers chiffrés grâce au test while (i < 10) :

awk 'BEGIN { i = 1; while (i < 10) { print "La somme de", i, "est", i*2; ++i } }'
La somme de 1 est 2
La somme de 2 est 4
La somme de 3 est 6
La somme de 4 est 8
La somme de 5 est 10
La somme de 6 est 12
La somme de 7 est 14
La somme de 8 est 16
La somme de 9 est 18

Les opérateurs AWK

OPERATEURDESCRIPTION
(…)Pour grouper
$Les opérateurs qui référencent les champs
++ —Incrémente et décrémente
^L’exponentiation (** peut également être utilisée et ** = pour l’opérateur d’affectation).
+ -!Unary Plus, moins la négation logique.
/%Multiplication, division et module.
+ –Ajout et soustraction.
Caractère espaceConcaténation de la chaîne spatiale.
| | &Pipe d’E / S pour GetLine, Imprimer et Printf.
<> <=> = ==! =Les opérateurs relationnels réguliers.
~! ~Match d’expression régulier, match nié. Remarque: N’utilisez pas d’expression régulière constante (/ FOO /) sur le côté gauche d’un ~ ou! ~.
Utilisez seulement une sur le côté droit. L’expression / foo / ~ exp a le même signification que (($ 0 ~ / foo /) ~ exp). Ce n’est généralement pas ce que vous voulez.
Indans l’adhésion au tableau.
&& Opérateur logique et.
||Opérateur logique ou.
?:L’expression conditionnelle C. Cela a la forme expr1? EXPR2: EXPR3. Si EXPR1 est vrai, la valeur de l’expression est EXPR2, sinon elle est expr3. Un seul des EXPR2 et EXPR3 est évalué.
= + = – = * = = / =% = ^ =Mission. L’attribution absolue (var = valeur) et l’attribution de l’opérateur (les autres formulaires) sont prises en charge.
Les opérateurs AWK

Les opérateurs de comparaison

Par exemple ci-dessous, on affiche les lignes d’un fichier dont les données de la seconde colonne commencent par un B ou un R.
Pour cela, on utilise des expressions régulières.
Les classes de caractères, [], dans des expressions régulières sont utilisées pour correspondre à un seul caractère sur ceux spécifiés entre crochets. Ici, nous combinons l’opérateur de match (~) avec des classes de caractères (/ ^ [br] /) pour imprimer toutes les lignes dans lesquelles le deuxième champ commence par le caractère “B” ou “R”, comme suit:

awk ' $2 ~ /^[BR]/ {print NR, $0 } ' fichier.txt

Le signe dollar ($) dans l’expression régulière (également appelé ancre) est utilisé pour correspondre à la fin d’une ligne. Dans les exemples suivants, nous combinons avec l’opérateur de match (~) pour imprimer toutes les lignes de la deuxième extrémité du champ avec le caractère «e», comme suit:

awk ' $2 ~ /e$/ {print NR, $0 } ' fichier.txt

Enfin vous pouvez utiliser des opérateurs de relation (==,> =, <=,>, <,! =) Pour effectuer une comparaison numérique. Ici, nous effectuons un chiffre supérieur ou égal (> =) pour imprimer les lignes qui ont la valeur 22 ou plus dans le troisième champ, comme suit:

awk ' $3 >= 22 {print NR, $0 } ' fichier.txt

L’opérateur logique ET

On utilise && pour évaluer deux expressions à vraies.
La syntaxe est :

expr1 && expr2

Ci-dessous, on demande à afficher les lignes entre 1 et 4, soit donc lorsque NR est supérieur à 1 ET inférieur à 4.

awk 'NR>1 && NR < 4' fichier

Voici un autre exemple qui vérifie que la valeur est comprise entre 0 et 7.

awk 'BEGIN {
   num = 5; if (num >= 0 && num <= 7) printf "%d est au format octal\n", num 
}'

L’opérateur logique OU

Evalue une opération à vrai si un des deux éléments est vrai.
Pour cela, on utilise || avec la syntaxe suivante :

expr1 || expr2

Ci-dessous, le texte s’affiche puisque les deux expressions sont vrais :

awk 'BEGIN {
   num = 2; if (num >= 0 || num <= 7) printf "Ce texte va s'\''afficher\n"}'

Là aussi puisque la première expression retourne vrai (num est bien supérieur à 0) :

awk 'BEGIN {
   num = 9; if (num >= 0 || num <= 7) printf "Ce texte va s'\'' afficher\n"}'

En revanche ci-dessous, rien ne va s’afficher puisque les deux expressions sont fausses :

awk 'BEGIN {
   num = 9; if (num == 0 || num == 7) printf "Ce texte va s'\'' afficher\n"}'

Les opérateurs mathématiques

Utilisez les caractères suivants afin d’effectuer une opération mathématique :

  • + : addition
  • – : soustractions
  • * : multiplication
  • / : division
  • % : pourcentage

Pour afficher l’opération avec son résultat en utilisant des variables :

awk 'BEGIN { a = 50; b = 20; print "(a / b) = ", (a / b) }'

Sinon pour afficher directement le résultat d’une opération mathématique :

awk 'BEGIN { a = 50; b = 20; print (a / b) }'

Un exemple identique d’opération mathématique avec un pourcentage :

awk 'BEGIN { a = 50; b = 20; print "(a % b) = ", (a % b) }'

Pour afficher le carré :

awk 'BEGIN { i = 1; while (i < 6) { print "Le carré de", i, "est", i*i; ++i } }'
Le carré de 1 est 1
Le carré de 2 est 4
Le carré de 3 est 9
Le carré de 4 est 16
Le carré de 5 est 25

Les opérateurs pour incrémenter et décrémenter

Pour incrémenter ou décrémenter des variables, on utilise les opérateurs suivants :

  • ++ : pour incrémenter des valeurs
  • : pour décrémenter des valeurs

Par exemple ci-dessous, on créé une variable i avec une valeur 1, puisque une boucle while qui tourne jusqu’à ce que la valeur i atteigne 6.
On incrémente chaque la variable i après l’avoir affiché dans print.

awk 'BEGIN { i = 1; while (i <= 6) { print "Ligne", i; ++i } }'

Le même exemple où cette fois-ci on décrémente la variable i qui débute avec la valeur 6.
La boucle while s’arrête lorsque i passe en dessous de la valeur 1, ce qui donne un décompte :

awk 'BEGIN { i = 6; while (i => 1) { print "Ligne", i; --i } }'

Les opérations sur les STRING

On peut aussi concaténer des variables textes très facilement.
Par exemple ci-dessous, on créé les variables str1 et str2 que l’on concatène dans str3 pour afficher en sortie avec print :

awk 'BEGIN { str1 = "Hello, "; str2 = "World"; str3 = str1 str2; print str3 }'

Les fonctions AWK sur le texte

FONCTIONSDESCRIPTION
gsub(r,s,t)Remplacer toutes les occurrence de r par s dans la chaîne t
index(s,t)Retourne la position la plus à gauche de la chaine t dans la chaine s
length(s)Renvoyer la longueur de la chaine s
match(s,r)Retourner l’index ou s correspond à r et positionne RSTART et RLENTH
split(s,a,fs) Split s dans le tableau a sur fs, retourne le nombre de champs
sprintf(fmt,liste expressions)Retourne la liste des expressions formattée suivant fmt
sub(r,s,t)Comme gsub, mais remplace uniquement la première occurrence
substr(s,i,n)retourne la sous chaine de s commençant en i et de taille n
Les fonctions de textes d’AWK

toupper, tolower : convertir un texte en minuscules, majuscules

On utilise ces fonctions pour passer un texte en majuscules ou minuscules en spécifiant une variable comme une colonne.

Pour passer tout un fichier en majuscules :

awk '{print  toupper($0)}' employes.txt

Par exemple pour passer la première colonne en majuscules :

awk '{print toupper($1) " " $2 " " $3}' FS=, employes.csv

gsub : rechercher/remplacer

gsub est une fonction qui permet de rechercher et remplacer des occurences.
Par exemple, ci -dessous, on remplace le mot Ubuntu par Débian :

echo "J'aime Ubuntu"| awk '{ gsub(/Ubuntu/,"Debian"); print $0}'
J'aime Debian

Dans cet autre exemple, gsub(/,/,” “) remplace la virgule par le caractère espace.

awk '{ gsub(/,/," "); print $1 $2 $3}' FS=, employes.csv

substr

substr permet d’effectuer du rechercher/remplacer du n caractère d’un mot.
Par exemple pour mettre en majuscule la première lettre d’un mot :

echo "merci d'écrire la première lettre en majuscule"|awk '{ $0 = toupper(substr($0,1,1)) substr($0,2) } $0'

Pour passer en majuscule le premier mot de la 3e colonne d’un fichier :

awk '{ $3 = toupper(substr($3,1,1)) substr($3,2) } $3' employes.txt

length

length permet de tester la longueur d’une chaîne de caractères.
Par exemple pour afficher seulement les lignes d’un fichier qui ont plus de 10 caractères.

awk 'length($0) > 10' employes.txt 

Les fonctions AWK mathématiques

FONCTIONSDESCRIPTION
atan2(y, x)Renvoyer l’arc tangent de y / x dans les radians
cos(expr)Retourner le cosinus de EXPR, qui est dans les radians
exp(expr)Calculez une exponentielle
int(expr)Renvoyer la valeur entier
log(expr) Pour utiliser une fonction logarithme naturelle
rand()Renvoyer un nombre aléatoire N, entre zéro et un, tel que 0 ≤ n <1
sin(expr)Renvoyez le sinus d’Expr, qui est dans les radians
sqrt(expr)Renvoyer la racine carrée de Expr
srand([expr])Réinitialiser la fonction de génération de nombre aléatoire
Les fonctions mathématiques d’AWK

SUM : faire la somme de colonnes

SUM vous donne la possibilité de faire la somme les valeurs d’une colonne.

awk '{ SUM=SUM+$5; print "Ligne: "NR " "$5 } END { print "Le total est : "SUM }' FS=, OFS=, employes.csv
Ligne: 1 10
Ligne: 2 8
Ligne: 3 7
Ligne: 4 9
Le total est : 34

COUNT : compter le nombre d’occurrences

COUNT permet de compter le nombre d’occurence.
Par exemple pour compter le nombre de lignes vides d’un fichier :

awk '/./ { COUNT+=1 } END { print COUNT }' fichier