start:linux:awk
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| start:linux:awk [2026/07/07 11:03] – [Awk] admin | start:linux:awk [2026/07/07 11:25] (Version actuelle) – [Awk] admin | ||
|---|---|---|---|
| Ligne 4: | Ligne 4: | ||
| {{ : | {{ : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | {{ : | ||
| + | |||
| Ligne 92: | Ligne 100: | ||
| Alors que cut ne fait que filtrer des champs en gardant le même ordre, Awk permet de changer facilement l' | Alors que cut ne fait que filtrer des champs en gardant le même ordre, Awk permet de changer facilement l' | ||
| $ awk ' | $ awk ' | ||
| + | ======== Doc awk ======== | ||
| + | |||
| + | |||
| + | Présentation | ||
| + | Présentation et syntaxe | ||
| + | awk est une commande très puissante, c'est un langage de programmation a elle tout seule qui permet une recherche de chaînes et l' | ||
| + | |||
| + | Une grande partie de la syntaxe a été empruntée au langage c, d' | ||
| + | |||
| + | La syntaxe de awk est la suivante: | ||
| + | |||
| + | awk [-F] [-v var=valeur] ' | ||
| + | |||
| + | ou | ||
| + | |||
| + | awk [-F] [-v var=valeur] -f fichier-config fichier | ||
| + | |||
| + | L' | ||
| + | |||
| + | L' | ||
| + | |||
| + | L' | ||
| + | |||
| + | Un programme awk possède la structure suivante: critère de sélection d'une chaîne {action}, quand il n'y a pas de critère c'est que l' | ||
| + | |||
| + | Exemple: | ||
| + | |||
| + | awk -F":" | ||
| + | |||
| + | Il n'y a pas de critères, donc l' | ||
| + | |||
| + | Généralement on utilisera awk en utilisant un script. | ||
| + | |||
| + | # | ||
| + | awk [-F] [-v var=valeur] ' | ||
| + | |||
| + | Vous appelerez votre script mon-script.awk, | ||
| + | |||
| + | mon-script.awk fichier-a-traiter | ||
| + | |||
| + | Dans la suite du cours, on utilisera awk en sous entendant que celui-ci est à insérer dans un script. | ||
| + | |||
| + | Le quote ' se trouve sur un clavier azerty standard avec le 4 et éventuellement l' | ||
| + | |||
| + | ATTENTION: ils existent plusieurs " | ||
| + | |||
| + | J'ai constaté des grosses différences de comportement entre le awk natif qu'on soit sous HP-UX, Solaris et sous LINUX, de même quand on insère la commande dans un script, on fait appel à un shell, suivant son type (bash shell, csh, ksh, ...), vous pouvez avoir quelques surprises. | ||
| + | Enregistrements et champs | ||
| + | awk scinde les données d' | ||
| + | |||
| + | Par exemple si le fichier à traiter est / | ||
| + | |||
| + | Dans un enregistrement les champs sont référencés par $1, $2, ..., $NF (dernier champ). Par exemple pour /etc/passwd $1 correspond au login, $2 au mot de passe crypté, $3 à l'UID, et $NF (ou $7) au shell. | ||
| + | |||
| + | L' | ||
| + | |||
| + | Par exemple, si l'on veut voir les champs login et home directory de / | ||
| + | |||
| + | awk -F":" | ||
| + | |||
| + | [retour haut de la page] | ||
| + | Critères de sélection | ||
| + | Présentation | ||
| + | Un critère peut être une expression régulière, | ||
| + | |||
| + | Le critère est inséré entre les chaînes BEGIN et END, avec la syntaxe suivante: | ||
| + | |||
| + | awk -F":" | ||
| + | |||
| + | BEGIN peut être suivi d' | ||
| + | Les expressions régulières | ||
| + | La syntaxe est la suivante: | ||
| + | |||
| + | /expression régulière/ | ||
| + | $0 /expression régulière/ | ||
| + | |||
| + | les instructions sont exécutées pour chaque ligne contenant une chaîne satisfaisant à l' | ||
| + | |||
| + | expression | ||
| + | |||
| + | les instructions sont exécutées pour chaque ligne où la valeur chaîne de l' | ||
| + | |||
| + | expression !/ | ||
| + | |||
| + | les instructions sont exécutées pour chaque ligne où la valeur chaîne de l' | ||
| + | |||
| + | Soit le fichier adresse suivant (nom, numéro de téléphone domicile, numéro de portable, numéro quelconque): | ||
| + | |||
| + | gwenael | 0298452223 | 0638431234 | 50 | ||
| + | marcel | 0466442312 | 0638453211 | 31 | ||
| + | judith | 0154674487 | 0645227937 | 23 | ||
| + | |||
| + | L' | ||
| + | |||
| + | awk 'BEGIN { print "On vérifie les numéros de téléphone; | ||
| + | $2 ! / | ||
| + | $3 ! / | ||
| + | END { print " | ||
| + | |||
| + | BEGIN est suivi d'une instruction d' | ||
| + | Les expressions relationnelles | ||
| + | Un critère peut contenir des opérateurs de comparaison (- <, < | ||
| + | |||
| + | awk 'BEGIN { print "On cherche lignes dont le numéro (champ 4) est supérieur à 30"; FS=" | ||
| + | $4 > 30 { print " | ||
| + | END { print " | ||
| + | |||
| + | Combinaison de critères | ||
| + | Un critère peut être constitué par une combinaison booléenne avec les opérateurs ou (||), et (&& | ||
| + | |||
| + | awk 'BEGIN { print "On cherche la ligne avec judith ou avec un numéro inférieur à 30"; FS=" | ||
| + | $1 = = " | ||
| + | END { print " | ||
| + | |||
| + | Plage d' | ||
| + | La syntaxe est la suivante critère1, | ||
| + | |||
| + | awk 'BEGIN NR==2;NR==6 { print "ligne n°" | ||
| + | END ' adresse | ||
| + | |||
| + | [retour haut de la page] | ||
| + | Les actions | ||
| + | Présentation | ||
| + | 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 prédéfinies traitant des numériques | ||
| + | atan2(y,x) arctangente de x/y en radian (entre -pi et pi) | ||
| + | |||
| + | cos(x) cosinus (radian) | ||
| + | |||
| + | exp(x) exponentielle à la puissance x | ||
| + | |||
| + | int(x) partie entière | ||
| + | |||
| + | log(x) logarithme naturel | ||
| + | |||
| + | rand(x) nombre aléatoire (entre 0 et 1) | ||
| + | |||
| + | sin(x) sinus (radian) | ||
| + | |||
| + | sqr(t) racine carrée | ||
| + | |||
| + | srand(x) définition d'une valeur de départ pour générer un nombre aléatoire | ||
| + | Fonctions prédéfinies traitant de chaînes de caractères | ||
| + | Pour avoir la liste des fonctions prédéfinies sur votre plate-forme vous devez faire un man awk, voici la liste des fonctions les plus courantes sur un système UNIX. | ||
| + | |||
| + | gsub(expression-régulière, | ||
| + | |||
| + | gsub(/ | ||
| + | |||
| + | index(chaine-de-caractères, | ||
| + | |||
| + | n=index(" | ||
| + | |||
| + | n=length(" | ||
| + | |||
| + | match(chaine-de-caractères, | ||
| + | |||
| + | n=match(" | ||
| + | |||
| + | printf(format, | ||
| + | |||
| + | printf(" | ||
| + | |||
| + | printf(" | ||
| + | |||
| + | split(chaine-de-caractères, | ||
| + | |||
| + | n=split(" | ||
| + | |||
| + | sprintf(format, | ||
| + | |||
| + | machaine=sprintf(" | ||
| + | |||
| + | substr(chaine-de-caractères, | ||
| + | |||
| + | machaine=substr(" | ||
| + | |||
| + | sub(expression-régulière, | ||
| + | |||
| + | system(chaine-de-caractères) permet de lancer des commandes d' | ||
| + | |||
| + | commande=sprintf(" | ||
| + | |||
| + | system(commande) | ||
| + | |||
| + | tolower(chaine-de-caracteres) retourne la chaîne de caractères convertie en minuscule | ||
| + | |||
| + | toupper(chaine-de-caracteres) retourne la chaîne de caractères convetie en majuscule | ||
| + | Fonctions définies par l' | ||
| + | Vous pouvez définir une fonction utilisateur de telle sorte qu' | ||
| + | |||
| + | fonction mafonction(liste des paramètres) | ||
| + | { | ||
| + | instructions | ||
| + | return valeur | ||
| + | } | ||
| + | |||
| + | [retour haut de la page] | ||
| + | Les variables et opérations sur les variables | ||
| + | Présentation | ||
| + | On trouve les variables système et les variables utilisateurs. Les variables systèmes non modifiables donnent des informations sur le déroulement du programme. Les variables utilisateurs sont définies par l' | ||
| + | Les variables utilisateur | ||
| + | Le nom des variables est formé de lettres, de chiffres (sauf le premier caractère de la variable), d' | ||
| + | Les variables prédéfinies (système) | ||
| + | Les variables prédéfinies sont les suivantes (en italique les valeurs par défaut): | ||
| + | |||
| + | ARGC nombre d' | ||
| + | |||
| + | ARGIND index du tableau ARGV du fichier courant | ||
| + | |||
| + | ARGV tableau des arguments de la ligne de commande néant | ||
| + | |||
| + | CONVFMT format de conversion pour les nombres " | ||
| + | |||
| + | ENVIRON tableau contenant les valeurs de l' | ||
| + | |||
| + | ERRNO contient une chaîne décrivant une erreur "" | ||
| + | |||
| + | FIELIWIDTHS variable expérimentale à ne pas utiliser | ||
| + | |||
| + | FILENAME nom du fichier d' | ||
| + | |||
| + | FNR numéro d' | ||
| + | |||
| + | FS contrôle le séparateur des champs d' | ||
| + | |||
| + | IGNORECASE contrôle les expressions régulières et les opérations sur les chaînes de caractères 0 | ||
| + | |||
| + | NF nombre de champs dans l' | ||
| + | |||
| + | NR nombre d' | ||
| + | |||
| + | OFMT format de sortie des nombres (nombre après la virgule) " | ||
| + | |||
| + | OFS séparateur des champs de sortie " " | ||
| + | |||
| + | ORS séparateur des enregistrements de sortie | ||
| + | |||
| + | RLENGTH néant longueur de la chaîne sélectionnée par le critère "\ n" | ||
| + | |||
| + | RS contrôle le séparateur des enregistrements d' | ||
| + | |||
| + | RSTART début de la chaîne sélectionnée par le critère néant | ||
| + | |||
| + | SUBSEP séparateur d' | ||
| + | Opérations sur les variables | ||
| + | On peut manipuler les variables et leur faire subir certaines opérations. On trouve différents types d' | ||
| + | |||
| + | var=30 affectation du chiffre 30 à var | ||
| + | |||
| + | var=" | ||
| + | |||
| + | var=" | ||
| + | |||
| + | "toto " et "est grand", | ||
| + | |||
| + | var=var-valeur var-=valeur expressions équivalentes | ||
| + | |||
| + | var=var+valeur var+=valeur expressions équivalentes | ||
| + | |||
| + | var=var*valeur var*=valeur expressions équivalentes | ||
| + | |||
| + | var=var/ | ||
| + | |||
| + | var=var%valeur var%=valeur expressions équivalentes | ||
| + | |||
| + | var=var+1 var++ expressions équivalentes | ||
| + | |||
| + | var=var-1 var-- expressions équivalentes | ||
| + | Les variables de champ | ||
| + | Comme on l'a déjà vu auparavant les champs d'un enregistrement (ligne) sont désignés par $1, $2, | ||
| + | |||
| + | i=3 | ||
| + | print $(i+1) | ||
| + | |||
| + | Provoque l' | ||
| + | |||
| + | Lorsque $0 est modifié, automatiquement les variables de champs $1,..$NF sont redéfinies. | ||
| + | |||
| + | Quand l'une des variables de champ est modifée, $0 est modifié. ATTENTION le séparateur ne sera pas celui définit par FS mais celui définit par OFS (output field separator). Exemple: | ||
| + | |||
| + | awk ' | ||
| + | "; | ||
| + | $4 != 22 {print $0} # Si le groupe n'est pas users on fait rien | ||
| + | $4 ==22 {$4=24; | ||
| + | END {print" | ||
| + | |||
| + | [retour haut de la page] | ||
| + | Les structures de contrôle | ||
| + | Présentation | ||
| + | Parmi les structures de contrôle, on distingue les décisions (if, else), les boucles (while, for, do-while, loop) et les sauts (next, exit, continue, break). | ||
| + | Les décisions (if, else) | ||
| + | La syntaxe est la suivante: | ||
| + | |||
| + | if (condition) si la condition est satisfaite (vraie) | ||
| + | instruction1 on exécute l' | ||
| + | else sinon | ||
| + | instruction2 on exécute l' | ||
| + | |||
| + | Si vous avez une suite d' | ||
| + | |||
| + | awk ' BEGIN{print" | ||
| + | NF==7 | ||
| + | { #pour toutes les lignes contenant 7 champss | ||
| + | if ($2=="" | ||
| + | { print $1 " n'a pas de mot de passe" | ||
| + | else sinon | ||
| + | { print $1 " a un mot de passe" | ||
| + | } | ||
| + | END{print" | ||
| + | |||
| + | Les boucles (while, for, do-while) | ||
| + | while, for et do-while sont issus du langage de programmation C. La syntaxe de while est la suivante: | ||
| + | |||
| + | while (condition) tant que la condition est satisfaite (vraie) | ||
| + | instruction on exécute l' | ||
| + | |||
| + | Exemple: | ||
| + | |||
| + | awk ' BEGIN{print" | ||
| + | { i=11 # initialisation du compteur à 1 (on commence par le champ 1) | ||
| + | while(i=< | ||
| + | { print $ii # on affiche le champ | ||
| + | i+++ # incrémentation du compteur pour passer d'un champ au suivant | ||
| + | } | ||
| + | } | ||
| + | END{print" | ||
| + | |||
| + | La syntaxe de for est la suivante: | ||
| + | |||
| + | for (instruction de départ; condition; instruction d' | ||
| + | |||
| + | Exemple: | ||
| + | |||
| + | awk ' BEGIN{print" | ||
| + | { | ||
| + | for (i=1; | ||
| + | { print $i } # on affiche le champ tant que la condition n'est pas satisfaite | ||
| + | } | ||
| + | END{print" | ||
| + | |||
| + | Avec for on peut travailler avec des tableaux. Soit le tableau suivant: tab[1]=" | ||
| + | |||
| + | for (index in tab) | ||
| + | { | ||
| + | print " | ||
| + | } | ||
| + | |||
| + | La syntaxe de do-while est la suivante: | ||
| + | |||
| + | do | ||
| + | {instructions}} on exécute les instructions | ||
| + | while (condition) jusqu' | ||
| + | |||
| + | La différence avec while, est qu'on est sûr que l' | ||
| + | Sauts controlés (break, continue, next, exit) | ||
| + | break permet de sortir d'une boucle, la syntaxe est la suivante: | ||
| + | |||
| + | for (;;;) boucle infinie | ||
| + | {instructions on exécute les instructionss | ||
| + | if (condition) | ||
| + | instructions} | ||
| + | |||
| + | Alors que break permet de sortir d'une boucle, continue force un nouveau passage dans une boucle. | ||
| + | |||
| + | next permet d' | ||
| + | |||
| + | exit permet d' | ||
| + | |||
| + | |||
| + | =====Les tableaux===== | ||
| + | ====Présentation==== | ||
| + | Un tableau est une variable se composant d'un certains nombres d' | ||
| + | |||
| + | Les termes matrice, vecteur ou table sont équivalents à tableau. | ||
| + | Les tableaux unidimensionnels | ||
| + | Vous pouvez définir un tableau unidimensionnel avec la syntaxe suivante: | ||
| + | |||
| + | var=1 | ||
| + | for (i=1; | ||
| + | { mon-tab[i]=var++} | ||
| + | |||
| + | On dispose de la fonction delete pour supprimer un tableau (delete tab). Pour supprimer un élément de tableau on tapera delete tab[index]. | ||
| + | Les tableaux associatifs | ||
| + | Un tableau associatif est un tableau unidimensionnel, | ||
| + | |||
| + | age[" | ||
| + | age[" | ||
| + | age[" | ||
| + | age[" | ||
| + | for (nom in age) | ||
| + | { print nom " a " age[nom] " | ||
| + | } | ||
| + | |||
| + | On a un tableau age avec une chaîne de caractères prénom comme index, on lui affecte comme éléments de tableau un numérique (age de la personne mentionnée dans le prénom). Dans la boucle for la variable nom est remplie successivement des chaînes de caractères de l' | ||
| + | |||
| + | Les valeurs de l' | ||
| + | Les tableaux multidimensionnels | ||
| + | awk n'est pas prévu pour gérer les tableaux multidimensionnels (tableaux imbriqués, ou à plusieurs index), néanmoins on peut simuler un tableau à deux dimensions de la manière suivante. On utilise pour cela la variable prédéfinie SUBSEP qui, rappelons le, contient le séparateur d' | ||
| + | |||
| + | SUBSEP=":" | ||
| + | i=" | ||
| + | tab[i, | ||
| + | |||
| + | L' | ||
| + | |||
| + | |||
/home/chanteri/www/fablab37110/data/attic/start/linux/awk.1783415033.txt.gz · Dernière modification : de admin
