Variables spéciales

Variables prédéfinies au lancement de awk

Le tableau suivant présente les principales variables internes du langage awk présentes en mémoire dès le lancement de la commande. La valeur de ces variables peut éventuellement être modifiée en fonction de la structure des données à traiter.

Nom de la variable Valeur par défaut Rôle de la variable
RS Newline (\n) Record Separator : Caractère séparateur d'enregistrement (lignes).
FS Suite d'espaces et/ou de tabulations Field Separator : Caractères séparateurs de champs.
OFS Espace Output Field Separator : Séparateur de champ utilisé pour l'affichage.
ORS Newline (\n) Output Record Separator : Caractère séparateur d'enregistrement en sortie.
ARGV - Tableau initialisé avec les arguments de la ligne de commande (options et nom du script awk exclus).
ARGC - Nombre d'éléments contenus dans le tableau ARGV.
ENVIRON Variables d'environnement exportées par le shell. Tableau contenant les variables d'environnement exportées par le shell.
CONVFMT %.6g Format de conversion des nombres en String.
OFMT %.6g Format de sortie des nombres.
SUBSEP \034 Caractère de séparation pour les routines internes des tableaux.

Par défaut, un enregistrement correspond donc à une ligne (suite de caractères terminée par "\n").

Lorsque la variable FS est initialisée avec un minimum de 2 caractères, cette valeur est interprétée comme une expression régulière.

Variables initialisées lors du traitement d'une ligne

Les enregistrements sont traités successivement. L'enregistrement courant est automatiquement découpé en champs et un certain nombre de variables internes awk sont initialisées. Le tableau suivant donne la liste des principales variables.

Nom de la variable Valeur de la variable
$0 Valeur de l'enregistrement courant
NF Number of Field : Nombre de champs de l'enregistrement courant.
$1, $2, ... $NF $1 contient la valeur du 1er champ, $2 la valeur du 2ème champ etc etc ... et $NF la valeur du dernier champ (NF est remplacé par sa valeur).
NR Number : Indice de l'enregistrement courant (NR vaut 1 quand la 1ère ligne est en cours de traitement, puis s'incrémente dès que awk change d'enregistrement).
FNR File Number : Indice de l'enregistrement courant relatif au fichier en cours de traitement.
FILENAME Nom du fichier en cours de traitement.
RLENGTH Longueur du string trouvé par la fonction match()
RSTART Première position du string trouvé par la fonction match()

Contrairement aux variables du shell, le symbole "$" des variables awk $1, $2 etc etc... fait partie du nom des variables.

Exemples simples

Premier exemple :

Ici, awk travaille sur le résultat de la commande ps -ef. La partie en rouge représente l'action que awk doit exécuter sur chaque ligne. Les simples quotes sont indispensables pour empêcher le shell d'interpréter les caractères destinés à la commande awk. Les instructions doivent être placées entre accolades. La fonction intégrée print va afficher à l'écran les champs 1 et 8 de chaque ligne.

$ ps -ef | awk '{print $1,$8}'
UID CMD
root init
...
www-data /usr/sbin/apache2
www-data /usr/sbin/apache2
root vzctl:
root -bash
postfix pickup
root ps
root awk
root /usr/lib/postfix/master
postfix qmgr
$

Deuxième exemple :

La fonction print peut également recevoir des chaines de caractères en argument.

$ ps -ef | awk '{print "User : " , $1, "\tCommande : " , $8}'
User :  UID     Commande :  CMD
User :  root    Commande :  init
User :  root    Commande :  [kthreadd/113]
User :  root    Commande :  [khelper/113]
User :  root    Commande :  [init-logger]
...
User :  root    Commande :  vzctl:
User :  root    Commande :  -bash
User :  root    Commande :  ps
User :  root    Commande :  awk
User :  root    Commande :  /usr/lib/postfix/master
$

\t représente le caractère tabulation.

Troisième exemple :

Modification du séparateur de champ "FS" grâce à l'option "-F"

$ cat /etc/passwd | awk -F : '{print $1,$7}'
root /bin/bash
...
nobody /bin/sh
libuuid /bin/sh
postfix /bin/false
sshd /usr/sbin/nologin
mysql /bin/false
$

Quatrième exemple :

$ cat /etc/passwd | awk -F : '{print "User : " , $1 , "\tShell : " , $7}'
User :  root    Shell :  /bin/bash
User :  daemon  Shell :  /bin/sh
User :  bin     Shell :  /bin/sh
User :  sys     Shell :  /bin/sh
User :  sync    Shell :  /bin/sync
User :  games   Shell :  /bin/sh
User :  man     Shell :  /bin/sh
User :  lp      Shell :  /bin/sh
User :  mail    Shell :  /bin/sh
User :  news    Shell :  /bin/sh
User :  uucp    Shell :  /bin/sh
User :  proxy   Shell :  /bin/sh
User :  www-data        Shell :  /bin/sh
User :  backup  Shell :  /bin/sh
User :  list    Shell :  /bin/sh
User :  irc     Shell :  /bin/sh
User :  gnats   Shell :  /bin/sh
User :  nobody  Shell :  /bin/sh
User :  libuuid         Shell :  /bin/sh
User :  postfix         Shell :  /bin/false
User :  sshd    Shell :  /usr/sbin/nologin
User :  mysql   Shell :  /bin/false
$

Si la fonction print ne reçoit pas d'argument, elle affiche $0.

$ cat /etc/passwd | awk -F : '{print}'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
$

Etiquettes: