cookbook de scripts awk

Creation: 1 decembre 2014
Mise à jour: 9 juillet 2018
Version: 1.2
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2014 - 2018 Jean-Louis BICQUELET-SALAÜN
cookbook awk

  cookbook awk  


Les exemples qui suivent s'attachent à donner un livre de recettes que l'on pourra rutiliser soit au sein d'un script awk soit dans un script bash.

boucles

La premire forme de boucle utilise for.

BEGIN { 
  for (i=1; i<=10; i++) print i
 }

La seconde forme de boucle utilise while.

  awk 'BEGIN { i=0
                while(i<10)
                {   printf i
                     i++
                }
	}'

les mots cls break et continue permettent de grer les boucles diffrement:

  • break permet de sortir de la boucle active,
  • continue permet de faire un nouveau passage dans la boucle . Les instructions aprs continue ne seront pas prises en compte). Cependant le nouveau passage se fera si et seulement si la condition est remplie.

On ne peut pas sortir de deux boucles imbriques grâce à un seul break (ou de faire un continue). Ces mots cls ne fonctionnent que sur la boucle active.

table de hash

liste de mots dans un hash

Une manire simple de remplir une table de hashage ou hash est d'utiliser la fonction split sur une chaine de caractre.

BEGIN { 
  split("this is not stored linearly",temp)
  for (i in temp) print temp[i]
 }

affichage de hash dans divers ordres

 BEGIN {
  n = split("ce n est pas stock linairement",temp)
  for (i=1; i<=n; i++) print i, temp[i]
  print ""
  for (i in temp) print i, temp[i]
 }

On affiche dans l'ordre croissant, puis en ordre décroissant.

1 ce
2 n
3 est
4 pas
5 stock
6 linairement

2 n
3 est
4 pas
5 stock
6 linairement
1 ce

création et affichage d'une table de hashage

 BEGIN {
   assoc["element1"] = 4
   assoc["element2] = 4
   assoc["le reste"] = 15
   for (i in assoc) print i,assoc[i]
 }

tableau

trier un tableau

Pour trier un tableau on peut utiliser une fonction, mais on peut aussi se servir de fonction systeme comme sort.

 BEGIN {
  split("56 566 3 43 99 100",temp," ")
  for (i in temp) print temp[i] | "sort"
  while ("sort" | getline) print
 }

manipulation des lignes

supprime les lignes vides

awk '{gsub(/ /,"\n");print}'

convertit les newlines (CR/LF) Dos en format Unix

awk '{sub(/\r$/,"");print}'   # chaque ligne doit se terminer par Ctrl-M

convertion unix (LF) vers unix

awk '{sub(/$/,"\r");print}

supprime tous les blancs en début de ligne

awk '{sub(/^[ \t]+/, ""); print}'

supprime tous les blancs en fin de ligne

awk '{sub(/[ \t]+$/, "");print}'

supprime tous les blancs en début et en fin de ligne

awk '{gsub(/^[ \t]+|[ \t]+$/,"");print}'
awk '{$1=$1;print}'        

insère 3 blancs au début de chaque lignes

awk '{sub(/^/, "   ");print}'

suppression des doublons

awk '!x[$0]++' fichier

recherche

cherche les lignes de commentaire

affiche les lignes de commentaires

awk '/^#/ {print }' /etc/services

et pour afficher les lignes qui ne sont pas des commentaires

awk '!/^#/ {print }' /etc/services

afficher les lignes impaires ou paires

affiche les lignes impaires

awk 'NR%2' fichier.txt

affiche les lignes impaires

awk '! NR%2' fichier.txt

substitution

remplacer (trouver et remplacer ) old par new pour chaque ligne

awk '{sub(/old/,"new");print}'           # remplace la 1 ere isubnstance
gawk '{$0=gensub(/old/,"new",3);print}'  # remplace la 3 eme instance
awk '{gsub(/old/,"new");print}'          # remplace toutes les instances des lignes

substituer old par new pour les lignes qui contiennent where

awk '/where/{gsub(/old/, "new")};{print}'

substituer old par new sauf pour les lignes qui contiennent where

awk '/!where/{gsub(/old/, "new")};{print}'

remplacer rouge, vert et bleu par couleur

awk '{gsub(/rouge|vert|bleu/, "couleur"); print}'

paragraphe

recherche d'un paragraphe

awk  ' BEGIN {RS = "" } /John/ {print $0,"\n"} ' fichier
John
1212

commandes shell

liste des commandes les plus frequentes

history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head

graphes

netstat -an | grep ESTABLISHED | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | awk '{ printf("%s\t%s\t",$2,$1) ; for (i = 0; i < $1; i++) {printf("*")}; print "" }'
10.12.40.16.58607     1       *
10.40.12.1.5481        1       *
127.0.0.1.32809 1       *
127.0.0.1.32812 1       *
127.0.0.1.32819 1       *
127.0.0.1.4105  16      ****************



* Merci Ruben