AWK et sa fonction system tellement pratique

Print Friendly, PDF & Email

Hello les ami(e)s !!! J’espère que vous allez bien dans cette période difficile à l’approche d’un durcissement de confinement. Difficile de pouvoir reprendre une vie normale alors que nos hôpitaux se remplissent.

Cependant il faut continuer à garder le moral et alles de l’avant. Certes le soleil nous donne un peu plus envie d’aller dehors mais il redonne tout de même une belle dose d’espérance.

Bref aujourd’hui parlons ou reparlons de awk. C’est souvent un outil méconnu ou tout du moins que l’on connaît pour faire des choses très simples et on se limite dans son utilisation grâce aux facilités apportées par la ligne de commandes (pipe etc).

AWK la simplicité à l’état pur

Je vous rappelle que j’avais fait il y a pas loin de 2 ans quelques tutos en guise de formation à awk. Ce petit cours de awk se limite à du petit oneline mais il permet déjà de faire des choses supers sympas je trouve :

  • élimination des doublons
  • compteurs
  • analyse de logs
  • conditions
  • génération de sql

Vous pouvez retrouver tout cela dans la playlist dédiée au scripting saison 1.

Mais parfois avec un petit rien en plus et on peut faire vraiment beaucoup plus. Je ne vous parle pas là de créer un vrai script AWK, multiligne. Non on reste dans le oneline avec encore un gros degré de simplicité.

Alors pour la démo prenons la CLI kubectl pour manipuler les pods. Je pars de cette commande mais vous pouvez partir de tout ce que vous souhaitez, l’idée est de manipuler la CLI.

Donc prenons la liste des pods avec un petit filtre pour afficher qu’une colonne.

kubectl get pods -o wide | awk '{print $6}'

Collectons la colonne des ip des pods (d’où le $6). Et maintenant pour manipuler un peu plus nous pouvons par exemple filtrer sur le statut des pods et leurs ips.

Découvrez  [Awk][Linux] : Lister les processus non killable et le stopper avec ps aux + awk

kubectl get pods -o wide | awk '($3 ~ "Running") && ($6 ~ "10.233.64.1.*") { print $6}'

Et notre commande system ?

On combine donc deux conditions. avec && et on applique un ~ pour la recherche sur base de regex.

C’est déjà pas mal mais là on se dit ça serait kool de lister tous les pods et de leur appliquer une commande system.

Concentrons nous juste sur un ping par exemple :

kubectl get pods -o wide | awk '($3 ~ "Running") && ($6 ~ "10.233.64.1.*") {print $1;system("ping -c 1 "$7)}'

Et on oubliera pas l’option -c1 pour ne pas boucler sur ping et ne réaliser qu’un seul ping (on pourrait définir un timeout plus approprié).

Nous avons simplement utilisé la fonction system de awk pour passer une commande… système. Simple est kool. On retrouve finalement ce que sait très bien faire xargs.

Alors avec notre kubectl on peut faire finalement quelque chose d’utile comme par exemple supprimé tous les pods en état evicted :

kubectl get pods -o wide | awk '($3 ~ "Evicted") {print "\n Drop >> "$1;system("kubectl delete pods "$1)}'

Et oui on retrouve là toute la facilité de awk car en plus vous le remarquez, on se permet même d’écrire une ligne avant. On pourrait en écrire une après ou encore faire un compteur pour dire le nombre de pods traités. Simple non ?

Bref AWK dans ce cas de figure permet de faire du personnalisable avec très peu de chose et sa fameuse commande system.

Alors si vous aimez ce genre de choses ou ces thématiques, venez vous joindre à la communauté Xavki. Vous pouvez aussi vous abonner pour ne pas manquer les prochaines vidéos.

Découvrez  [AWK][Linux] : Supprimer les doublons de votre PATH... RS FS et ORS OFS

L’objectif de la chaine est simple : se former et progresser ensemble

Enfin si vous voulez vous faire la main avec bash et si vous disposez de légères notions avec docker, vous pouvez vous rendre sur cette série de vidéos. Une formation qui vous conduira à réaliser un script bash permettant d’instancier des conteneurs docker avec systemd et ssh.

Un bon moyen de joindre l’utile à l’agréable avec un poil de docker et à la sortie la possiblité d’utiliser des conteneurs comme des machines virtuelles avec un gros gain de temps au provisionning.

Se prendre au jeu de AWK

Enfin si vous avez du temps et que vous êtes du genre curieux. Vous pouvez poursuivre sur le chemin de awk. En scriptant bien sûr et en utilisant des évolutions de ce langage comme le gawk ou encore le mawk. Ce dernier m’a été évoqué en parlant de performance. Il semblerait le plus rapide pour processer de la données réparties sur différents fichiers. Un article fait un petit focus sur les performances du mawk ici.

Cependant après avoir fait quelques tests maisons je ne parviens pas à des resultats explicites pour pouvoir en faire une réelle démonstration.

Toujours sur la performance en matière de processer du fichier text, vous pouvez aussi vous reporter à cet article. Celui-ci fait une analyse comparative entre le nawk, gawk et mawk assez intéressante. Il s’agit de faire un comparatif sur l’utilisation de la mémoire par ses derniers.