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
informatique:linux:awk [2015/08/28 08:52] – [Les fonctions texte] pteuinformatique:linux:awk [2022/04/13 13:03] (current) – [Exemples] N'afficher que les lignes impaires pteu
Line 1: Line 1:
-{{tag>langage programmation}} 
- 
- 
 ======awk====== ======awk======
  
Line 86: Line 83:
   * ''tolower(s)'' : passer la chaîne en minuscules   * ''tolower(s)'' : passer la chaîne en minuscules
   * ''toupper(s)'' : passer la chaîne en majuscules   * ''toupper(s)'' : passer la chaîne en majuscules
 +  * ''count[s]'' : compte le nombre d’occurrence de s
  
 ===Le cas printf=== ===Le cas printf===
Line 97: Line 95:
 dude                 a dude dude                 a dude
 robert               le gros robert 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> </code>
 +
 ====Les fonctions mathématiques==== ====Les fonctions mathématiques====
  
Line 105: Line 126:
  
   * imprime chaque ligne du fichier /etc/passwd après avoir effacé le deuxième champs   * imprime chaque ligne du fichier /etc/passwd après avoir effacé le deuxième champs
-<code>+<code bash>
 awk -F ":" '{ $2 = "" ; print $0 }' /etc/passwd awk -F ":" '{ $2 = "" ; print $0 }' /etc/passwd
 </code> </code>
  
   * imprime le nombre total de lignes du fichiers   * imprime le nombre total de lignes du fichiers
-<code>+<code bash>
 awk 'END {print NR}' /etc/passwd awk 'END {print NR}' /etc/passwd
 </code> </code>
  
   * lire la 3ème ligne d'un fichier :   * lire la 3ème ligne d'un fichier :
-<code>+<code bash>
 awk '{if (NR==3) print}' <fichier> awk '{if (NR==3) print}' <fichier>
 </code> </code>
  
   * imprime le dernier champs de chaque ligne   * imprime le dernier champs de chaque ligne
-<code>+<code bash>
 awk '{print $NF}' /etc/passwd awk '{print $NF}' /etc/passwd
 </code> </code>
  
   * imprime le login et le temps de connexion.   * imprime le login et le temps de connexion.
-<code>+<code bash>
 who | awk '{print $1,$5}' who | awk '{print $1,$5}'
 </code> </code>
  
   * imprime les lignes de plus de 75 caractères. (''print'' équivaut à ''print $0'')   * imprime les lignes de plus de 75 caractères. (''print'' équivaut à ''print $0'')
-<code>+<code bash>
 awk 'length($0)>75 {print}' /etc/passwd awk 'length($0)>75 {print}' /etc/passwd
 </code> </code>
  
   * tests sur le fichier /etc/passwd :   * tests sur le fichier /etc/passwd :
-<code>+<code bash>
 awk 'BEGIN { print "Verification du fichier /etc/passwd pour ..."; awk 'BEGIN { print "Verification du fichier /etc/passwd pour ...";
             print "- les utilisateurs avec UID = 0 " ;             print "- les utilisateurs avec UID = 0 " ;
Line 147: Line 168:
  
   * supprimer le suffixe du domaine d'un nom de machine :   * supprimer le suffixe du domaine d'un nom de machine :
-<code>+<code bash>
 echo "toto.domaine.fr est un nom trop long !" | awk 'gsub(/\..*$/,"",$1) {print "machine="$1}' echo "toto.domaine.fr est un nom trop long !" | awk 'gsub(/\..*$/,"",$1) {print "machine="$1}'
 </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}'
 + toto
 +</code>
 +
 +  * émuler la fonction trim (efface les espaces avant et après une chaine) :
 +<code bash>
 +echo -e "toto   :titi\n   tata:tutu" | \
 + awk -F\: '{ sub(/^[ \t\r\n]+/, "", $1);sub(/[ \t\r\n]+$/, "", $1);print "\""$1"\""}'
 +</code>
 +
 +  * ne pas afficher les lignes en doublon
 +<code bash>
 +# count s'incrémente à chaque ligne déjà rencontrée ; on n'affiche donc la ligne qu'à sa première apparition
 +awk '!(count[$0]++)' fic.txt
 +</code>
 +
 +  * compter le nombre de caractère dans une ligne (k pour l'exemple)
 +<code bash>
 +echo $ligne | awk -F'k' '{print NF-1}'
 +</code>
 +
 +  * N'afficher que les lignes paires
 +<code bash>
 +awk 'NR%2==0' fic.txt
 +</code>
informatique/linux/awk.1440751935.txt.gz · Last modified: 2015/08/28 08:52 by pteu