User Tools

Site Tools


informatique:linux:awk

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
informatique:linux:awk [2011/01/05 16:26] – [Les variables prédéfinies] pteuinformatique:linux:awk [2019/06/06 07:25] – [Exemples] pteu
Line 22: Line 22:
 ====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>
  
Line 53: Line 73:
 | SUBSEP   | séparateur de subscript || | 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
Line 64: Line 84:
   * ''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====
Line 114: Line 174:
 </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>
informatique/linux/awk.txt · Last modified: 2022/04/13 13:03 by pteu