Avec AWK, il est facile de rechercher une valeur dans un texte, pour remplacer un champ ou juste connaître le contenu.
Pour notre premier exemple, on va rechercher le nombre de Badcalls dans les statistiques NFS d'un serveur.
La commande de base est 'nfsstat -cn' qui donne le résultat suivant :
nfsstat -cn
Client nfs:
calls badcalls clgets cltoomany
7 0 0 0
Version 2: (0 calls)
null getattr setattr root lookup readlink read
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
wrcache write create remove rename link symlink
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
mkdir rmdir readdir statfs
0 0% 0 0% 0 0% 0 0%
Version 3: (0 calls)
null getattr setattr lookup access readlink read
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
write create mkdir symlink mknod remove rmdir
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
rename link readdir readdir+ fsstat fsinfo pathconf
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
commit
0 0%
On constate que le nombre de 'badcalls' est donné dans la ligne du dessous.
Avec Awk, il suffit de demander de trouver la ligne comportant badcalls et de lire la seconde valeur de la ligne suivante :
Cela se traduit de la façon suivante :
nfsstat -cn | awk 'BEGIN {}
/badcalls/ { getline;printf($2"\n") };
END {} '
Le '/badcalls/' demande au programme de traiter le cas où la ligne comporte la chaine 'badcalls'.
La chaine située sur la même ligne indique de :
- Lire la ligne suivante
- d'afficher le second champ( le séparateur étant par défaut l'espace(' ')
Si on ne trouve pas, on ne fait aucune action.
Le cas suivant permettra de remplacer une valeur dans un fichier.
Le mot clé 'next' peut remplacer la commande 'getline' pour indiquer de passer à la ligne suivante, sans rien faire.