Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
informatique:linux:awk [2010/05/05 09:33] – pteu | informatique:linux:awk [2019/06/06 07:25] – [Exemples] pteu |
---|
====Les options==== | ====Les options==== |
| |
* ''-f <fichier>'' la commande s'applique à un fichier | * ''-f <fichier>'' précise un fichier de script awk |
| <code bash> |
| vi test.awk |
| BEGIN{FS=";"; OFS=" : "} |
| $0 ~ "test" {print $0} |
| :x |
| |
| awk -f test.awk fichier.txt |
| ceci est un test |
| </code> |
* ''-F "<séparateur>"'' spécifie le séparateur de champs (" " (espace) par défaut). NB : on peut spécifier plusieurs séparateurs en les séparant par "|" : | * ''-F "<séparateur>"'' spécifie le séparateur de champs (" " (espace) par défaut). NB : on peut spécifier plusieurs séparateurs en les séparant par "|" : |
<code> | <code bash> |
echo "toto;tata-titi" | awk -F":|-" '{print $1" "$2" "$3}' | echo "toto;tata-titi" | awk -F":|-" '{print $1" "$2" "$3}' |
toto tata titi | toto tata titi |
</code> | </code> |
* ''-v var="val"'' : permet d'affecter une valeur //val// à une variable //var// avant la partie BEGIN | * ''-v var="val"'' : permet d'affecter une valeur //val// à une variable //var// avant la partie BEGIN |
<code> | <code bash> |
HOST=toto ; echo titi | awk -v h=$HOST '{print "h="h}' | HOST=toto ; echo titi | awk -v h=$HOST '{print "h="h}' |
h=toto | h=toto |
| </code> |
| |
| Autre façon de passer des variables dans un fichier de script : |
| <code bash> |
| vi test.awk |
| BEGIN{FS=";"; OFS=" : "} |
| $0 ~ rechch {print $0} |
| :x |
| |
| awk -f test.awk rechch=test fichier.txt |
| ceci est un test |
</code> | </code> |
| |
====Les variables prédéfinies==== | ====Les variables prédéfinies==== |
| |
''<variable>'' <desc> <valeur par défaut> | ^ Variable ^ Description ^ Valeur par défaut ^ |
* ''ARGC'' Nombre d'arguments de la ligne de commande | | ARGC | nombre d'arguments de la ligne de commande || |
* ''ARGV'' tableau des arguments de la ligne de commnde | | ARGV | tableau des arguments de la ligne de commande || |
* ''FILENAME'' nom du fichier sur lequel on applique les commandes | | FILENAME | nom du fichier sur lequel on applique les commandes || |
* ''FNR'' Nombre d'enregistrements du fichier | | ENVIRON | tableau associatif des variables d'environnement || |
* ''FS'' separateur de champs en entrée | | FNR | nombre d'enregistrements parcourus du fichier courant || |
* ''NF'' nombre de champs de l'enregistrement courant | | FS | séparateur de champs (en entrée) | <tab>, <espace> ou <retour chariot> contigus | |
* ''NR'' nombre d'enregistrements deja lu | | NF | nombre de champs de l'enregistrement courant || |
* ''OFMT'' format de sortie des nombres | | NR | nombre d'enregistrements parcouru (tous fichiers confondus) || |
* ''OFS'' separateur de champs pour la sortie | | OFMT | format de sortie des nombres || |
* ''ORS'' separateur d'enregistrement pour la sortie | | OFS | séparateur de champs pour la sortie | <espace> | |
* ''RLENGTH'' longueur de la chaine trouvée | | ORS | séparateur d'enregistrement pour la sortie | <retour chariot> | |
* ''RS'' separateur d'enregistrement en entrée | | RLENGTH | longueur de la chaine trouvée || |
* ''RSTART'' debut de la chaine trouvée | | RS | séparateur d'enregistrement en entrée | <retour chariot> | |
* ''SUBSEP'' separateur de subscript | | RSTART | début de la chaine trouvée || |
| | SUBSEP | séparateur de subscript || |
| |
====Les fonctions==== | ====Les fonctions texte==== |
| |
Les paramètres sont soit des chaines de caractère (s et t), soit des regexp (r) soit des entiers (i et n). | Les paramètres sont soit des chaines de caractères (s et t), soit des regexp (r) soit des entiers (i et n). |
* ''gsub(r,s,t)'' : sur la chaine t, remplace toutes les occurrence de r par s | * ''gsub(r,s,t)'' : sur la chaine t, remplace toutes les occurrence de r par s |
* ''index(s,t)'' : retourne la position la plus à gauche de la chaine t dans la chaine s | * ''index(s,t)'' : retourne la position la plus à gauche de la chaine t dans la chaine s |
* ''sub(r,s,t)'' : comme gsub, mais remplace uniquement la première occurrence | * ''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 | * ''substr(s,i,n)'' : retourne la sous chaine de s commençant en i et de taille n |
| * ''tolower(s)'' : passer la chaîne en minuscules |
| * ''toupper(s)'' : passer la chaîne en majuscules |
| |
| ===Le cas printf=== |
| |
| **printf** et ses dérivées sont des fonctions d'affichage de texte qui permettent de formater la sortie (pour un résultat bien léché comme on aime). Voici quelques cas d'utilisation commentés : |
| <code bash> |
| # afficher les logins et description des utilisateurs locaux qui utilisent le shell /bin/bash |
| # en alignant les logins à droite et sur 20 caractères |
| awk -F: '$7 ~ /\/bin\/bash/ {printf "%-20s %s\n", $1, $5}' /etc/passwd |
| root root |
| dude a dude |
| robert le gros robert |
| |
| # puisque l'affichage est par colonne, on va afficher les noms pour être plus parlant |
| # on utilise l'instruction BEGIN qui, comme on l'a vu, ne s'exécute qu'une fois en début de script |
| awk -F: 'BEGIN {printf "%-20s %s\n", "login:","description:"} $7 ~ /\/bin\/bash/ {printf "%-20s %s\n", $1, $5}' /etc/passwd |
| login: description: |
| root root |
| dude a dude |
| robert le gros robert |
| |
| # on peut même définir un format d'affichage pour ne pas avoir a le retaper à chaque printf : |
| awk -F: 'BEGIN {format = "%-20s %s\n"; printf format, "login:","description:"; printf format, "---","---"} $7 ~ /\/bin\/bash/ {printf format, $1, $5}' /etc/passwd |
| login: description: |
| --- --- |
| root root |
| dude a dude |
| robert le gros robert |
| |
| # la même commande, en plus lisible : |
| awk -F: 'BEGIN {format = "%-10s %s\n" |
| printf format, "login:","description:" |
| printf format, "---","---"} |
| $7 ~ /\/bin\/bash/ {printf format, $1, $5}' /etc/passwd |
| </code> |
| |
| ====Les fonctions mathématiques==== |
| |
| cos(x), exp(x), int(x), log(x), sin(x), sqrt(x), atan2(x,y), rand(x), srand(x) |
| |
====Exemples==== | ====Exemples==== |
</code> | </code> |
| |
| * afficher les blocs de texte du fichier FIC.txt compris entre les balises BEGIN et END : |
| <code bash> |
| awk '/BEGIN/,/END/' FILE.txt |
| </code> |
| |
| * supprimer (ne pas afficher) les doublons de lignes dans un fichier : |
| <code bash> |
| awk '!x[$0]++' test.tmp |
| </code> |
| |
| * quitter la boucle awk après le premier match |
| <code bash> |
| echo -e "toto\ntoto\n" | awk '/toto/ {print; exit}' |
| </code> |