awk : quelques notes

awk est comme une boucle infinie qui prend pour argument les lignes d'un fichier.

Il execute les actions entre {} tant que les conditions sont vraies, sinon il passe à la ligne suivante.

La condition peut être un test sur une variable (v == 2), ou bien un test sur pattern /^Debut/.

Par défaut, awk affiche la ligne.

Utiliser "END" permet d'exécuter des commandes (entre {}) à la fin, "BEGIN" au début. Pratique pour définir des variables..

Exemple :

#!/usr/bin/awk -f
BEGIN { print "File\tOwner"}
{ print $8, "\t", $3}
END { print " - DONE -" }

Variables spéciales

On peut utiliser des variables sans les déclarer puis les afficher ensuite.

Par défaut, une variable non initialisée contient "".

Patterns:

/admin/ { ... }     # any line that contains 'admin'
/^admin/ { ... }    # lines that begin with 'admin'
/admin$/ { ... }    # lines that end with 'admin'
/^[0-9.]+ / { ... } # lines beginning with series of numbers and periods
/(POST|PUT|DELETE)/ # lines that contain specific HTTP verbs

Actions et fonctions

Voir aussi le man de awk pour match(), sub(), ...

getline

getline() permet de lire le contenu d'un autre fichier et l'enregistrer en mémoire ou bien le traiter comme la ligne courante $0.

Chaque nouvel appel à getline() renvoie la ligne suivante du fichier lu.

Il FAUT penser à fermer le fichier ET à vérifier que la lecture se passe bien.

Par exemple, pour enregistrer dans "var" la première ligne de "fichier.txt", on suivra la démarche suivante :

f = "fichier.txt"
if ((getline var < f) != 1 ) { next }
close(f)

On peut simuler la commande cat ainsi :

while ((getline < "fichier.txt") == 1) {
	print
}
close("fichier.txt")

Astuces diverses

On peut combiner les tests pour un pattern et une variable. Par exemple, pour ne traîter QUE la 1ere ligne SI elle ne contient pas "absent" :

apm | awk 'NR==1 && !/absent/ {printf " ⚡%s", $4}'

On peut définir toute une série de caractères comme délimiteurs. Par exemple n'importe quelle lettre suivie de ":" :

uptime | awk -F'[a-z]:' '{print $2}'

Au lancement de awk, utiliser "-v var=value" permet de définir une variable. Ce flag peut être utilisé plusieurs fois.

On peut concaténer des chaînes de caractères ainsi :

txt1 = "Hello"
txt2 = "World"
txt = txt1 " " txt2
# txt contient "Hello World"

On n'est pas obligé de prendre un fichier texte ou de lire l'entrée standard. On peut aussi interpréter une liste passée en argument :

BEGIN {
    for ( i = 1; i <= ARGC; i++ ) {
		print ARGV[i]
	}
	exit
}

trim avec awk

awk '{sub(/^[[:blank:]]+/, ""); sub(/[[:blank:]]+$/, ""); print }'

Références :

https://gregable.com/2010/09/why-you-should-know-just-little-awk.html

https://ferd.ca/awk-in-20-minutes.html

https://minhhh.github.io/posts/awk-tutorial