Commande awk
Fonction
Cette commande permet de détecter dans les fichiers les lignes correspondant à un modèle spécifique et d'exécuter les actions spécifiées.
Syntaxe
awk [ -FEre ] [ -v Affectation ] ... { -f FichierProgramme | 'Programme' }
[ [ Fichier ... | Affectation ... ] ] ...
Description
La commande awk utilise un ensemble d'instructions indiquées par l'utilisateur pour comparer un ensemble de fichiers, ligne par ligne, à des expressions régulières étendues indiquées par l'utilisateur. Elle exécute ensuite des actions sur toute ligne qui correspond aux expressions régulières étendues.
La recherche de modèles de la commande awk est plus générale que celle exécutée par la commande grep et permet à l'utilisateur d'effectuer plusieurs actions sur les lignes de texte saisies. Le langage de programmation de la commande awk ne requiert pas de compilation et autorise l'utilisateur à faire appel à des variables, des fonctions numériques, des fonctions de chaîne et des opérateurs logiques.
La commande awk est affectée par les variables LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_NUMERIC, NLSPATH et PATH.
Cet article est consacré aux éléments suivants :
Types d'entrée gérés par la commande awk
La commande awk gère deux types d'entrée : Les fichiers texte et les instructions programme.
Fichiers texte en entrée
Cette commande gère la recherche et l'exécution d'actions dans les fichiers texte en entrée. Les fichiers sont spécifiés comme suit :
- par le biais de la variable Fichier sur la ligne de commande ;
- en modifiant les variables spéciales ARGV et ARGC ;
- via une entrée standard si la variable Fichier n'est pas spécifiée.
Si vous spécifiez plusieurs fichiers par le biais de la variable Fichier, ils sont traités dans l'ordre indiqué.
Instruction de programme
Les instructions fournies par l'utilisateur déterminent les actions exécutées par la commande awk. Elles proviennent soit de la variable "Programme" spécifiée sur la ligne de commande, soit d'un fichier défini par l'option -f, en conjonction avec la variable FichierProgramme. Si plusieurs fichiers de programme sont indiqués, ils sont concaténés dans l'ordre spécifié et les instructions sont utilisées dans l'ordre qui en résulte.
Sortie de la commande awk
La commande awk génère trois types de sortie à partir des données que contient le fichier texte en entrée :
- Les données sélectionnées peuvent être imprimées sur la sortie standard sans modification du fichier en entrée.
- Des sections sélectionnées du fichier en entrée peuvent être modifiées.
- Les données sélectionnées peuvent être modifiées et imprimées sur la sortie standard, avec ou sans modification du contenu du fichier en entrée.
Un même fichier peut donner lieu à tous ces types de sortie. Le langage de programmation reconnu par la commande awk permet à l'utilisateur de rediriger la sortie.
Traitement des fichiers basé sur les enregistrements et les zones
Les fichiers sont traités comme suit :
- La commande awk analyse ses instructions et effectue toute action dont l'exécution est spécifiée avant la lecture du fichier en entrée.
L'instruction BEGIN en langage de programmation awk permet à l'utilisateur de spécifier l'exécution d'un ensemble d'instructions avant la lecture du premier enregistrement. Cette méthode se révèle particulièrement utile pour l'initialisation des variables spéciales.
- Un enregistrement est lu dans le fichier en entrée.
Il constitue un ensemble de données séparées par un séparateur d'enregistrements. La valeur par défaut du séparateur d'enregistrements correspond au caractère d'avance ligne, qui fait de chaque ligne du fichier un enregistrement distinct. Pour modifier sa valeur, utilisez la variable spéciale RS.
- L'enregistrement est comparé à chaque modèle spécifié par les instructions de la commande awk.
Les instructions de la commande peuvent spécifier la comparaison d'une zone déterminée au sein de l'enregistrement. Par défaut, les zones sont séparées par des caractères blancs (blancs ou tabulations). A chaque zone correspond une variable de zone.
La variable $1 est affectée à la première zone d'un enregistrement, la variable $2 à la deuxième zone, et ainsi de suite. La variable $0 est affectée à l'enregistrement entier.
Pour modifier le séparateur de zone, utilisez l'option -F sur la ligne de commande ou définissez la variable spéciale FS. Celle-ci gère les valeurs suivantes : Blanc, caractère unique ou expression régulière étendue.
- Si l'enregistrement correspond à un modèle, toute action associée à celui-ci est exécutée sur l'enregistrement.
- Une fois l'enregistrement comparé à chaque modèle et toutes les actions spécifiées exécutées, l'enregistrement suivant est lu dans le fichier en entrée. Le processus est alors répété jusqu'à ce que tous les enregistrements soient lus.
- Si vous avez défini plusieurs fichiers en entrée, le fichier suivant est ouvert et le processus répété jusqu'à ce que tous les fichiers en entrée soient lus.
- Une fois le dernier enregistrement du dernier fichier lu, la commande awk exécute toute instruction dont l'exécution doit avoir lieu après le traitement des fichiers en entrée.
L'instruction END en langage de programmation awk permet à l'utilisateur de spécifier des actions dont l'exécution suit la lecture du dernier enregistrement. Ce processus est particulièrement utile pour l'envoi de messages relatifs aux tâches exécutées par la commande awk.
Langage de programmation de la commande awk
Le langage de programmation de la commande awk comprend des instructions exprimées comme suit :
Modèle { Action }
Si un enregistrement correspond au modèle indiqué ou qu'il contient une zone qui correspond au modèle, l'action connexe est alors exécutée. Vous pouvez spécifier un modèle sans définir d'action, auquel cas la ligne entière qui contient le modèle est écrite dans la sortie standard. Une action sans modèle est exécutée pour chaque enregistrement de fichier en entrée.
Modèles
La syntaxe du langage de la commande awk gère quatre types de modèle :
Expressions régulières
Les expressions régulières étendues utilisées par la commande awk sont similaires à celles de la commande grep.
Sous sa forme la plus simple, une expression régulière étendue est une chaîne de caractères entourée de barres obliques. Supposons par exemple que le fichier fichier d'essai contienne les éléments suivants :
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
Entrer la ligne de commande suivante :
awk '/smi/' fichier d'essai
imprimerait sur la sortie standard tous les enregistrements qui contiennent une occurrence de la chaîne smi. Dans cet exemple, le programme '/smi/' associé à la commande awk est un modèle sans action. La sortie est la suivante :
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
Les caractères spéciaux suivants permettent de composer des expressions régulières étendues :
| Caractère |
Fonction |
|
+ |
Spécifie qu'une chaîne correspond au modèle si une ou plusieurs occurrences du caractère ou de l'expression régulière étendue qui précède le signe plus (+) sont incluses dans la chaîne. La ligne de commande :
awk '/smith+ern/' fichier d'essai
imprime sur la sortie standard tout enregistrement contenant une chaîne dans laquelle figurent les caractères smit, suivis d'un ou de plusieurs caractères h et terminée par les caractères ern. Le résultat de cet exemple est le suivant :
smithern, harry
smithhern, anne |
|
? |
Spécifie qu'une chaîne correspond au modèle si zéro ou une occurrence du caractère ou de l'expression régulière étendue qui précède le point d'interrogation (?) figure dans la chaîne. La ligne de commande :
awk '/smith?/' fichier d'essai
imprime sur la sortie standard tous les enregistrements contenant les caractères smit, suivis de zéro ou d'une occurrence du caractère h. Le résultat de cet exemple est le suivant :
smith, alan
smithern, harry
smithhern, anne
smitters, alexis |
|
| |
Spécifie qu'une chaîne correspond au modèle si l'une des deux chaînes séparées par une ligne verticale (|) figure dans la chaîne. La ligne de commande :
awk '/allen
|
alan /' fichier d'essai
imprime sur la sortie standard tous les enregistrements contenant la chaîne allen ou alan. Le résultat de cet exemple est le suivant :
smiley, allen
smith, alan |
|
( ) |
Regroupe des chaînes dans des expressions régulières. La ligne de commande :
awk '/a(ll)?(nn)?e/' fichier d'essai
imprime sur la sortie standard tous les enregistrements contenant la chaîne ae, alle, anne ou allnne. Le résultat de cet exemple est le suivant :
smiley, allen
smithhern, anne |
|
{m} |
Spécifie qu'une chaîne correspond au critère si m occurrences exactement du modèle figurent dans la chaîne. La ligne de commande :
awk '/l{2}/' fichier d'essai
imprime sur la sortie standard :
smiley, allen |
|
{m,} |
Spécifie qu'une chaîne correspond au critère si au moins m occurrences du modèle figurent dans la chaîne. La ligne de commande :
awk '/t{2,}/' fichier d'essai
imprime sur la sortie standard :
smitters, alexis |
|
{m, n} |
Spécifie qu'une chaîne correspond au critère si un nombre d'occurrences compris entre m et n inclus figurent dans la chaîne (sous réserve que m <= n).
La ligne de commande :
awk '/er{1, 2}/' fichier d'essai
imprime sur la sortie standard :
smithern, harry
smithern, anne
smitters, alexis |
|
[Chaîne] |
Signifie que l'expression régulière correspond à tout caractère indiqué par la variable Chaîne entre crochets.
La ligne de commande :
awk '/sm[a-h]/' fichier d'essai
imprime sur la sortie standard tous les enregistrements contenant les caractères sm suivis de tout caractère compris entre a et h, classés par ordre alphabétique. Le résultat de cet exemple est le suivant :
smawley, andy |
|
[^ Chaîne] |
La présence d'un caret (^) entre crochets ([ ]) et au début de la chaîne spécifiée indique que l'expression régulière ne correspond à aucun caractère placé entre crochets. Ainsi, la ligne de commande :
awk '/sm[^a-h]/' fichier d'essai
imprime sur la sortie standard :
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis |
|
~,!~ |
Représente une instruction conditionnelle indiquant qu'une variable spécifiée correspond (tilde) ou ne correspond pas (tilde, point d'exclamation) à l'expression régulière.
La ligne de commande :
awk '$1 ~ /n/' fichier d'essai
imprime sur la sortie standard tous les enregistrements dont la première zone contient le caractère n. Le résultat de cet exemple est le suivant :
smithern, harry
smithhern, anne |
|
^ |
Indique le début d'une zone ou d'un enregistrement. La ligne de commande :
awk '$2 ~ /^h/' fichier d'essai
imprime sur la sortie standard tous les enregistrements dans lesquels h est le premier caractère de la deuxième zone. Le résultat de cet exemple est le suivant :
smithern, harry |
|
$ |
Indique la fin d'une zone ou d'un enregistrement. La ligne de commande :
awk '$2 ~ /y$/' fichier d'essai
imprime sur la sortie standard tous les enregistrements dans lesquels y est le dernier caractère de la deuxième zone. Le résultat de cet exemple est le suivant :
smawley, andy
smithern, harry |
|
. (point) |
Correspond à tout caractère, à l'exception du caractère d'avance ligne après un espace. La ligne de commande :
awk '/a..e/' fichier d'essai
imprime sur la sortie standard tous les enregistrements dans lesquels les caractères a et e sont séparés par deux caractères.
Le résultat de cet exemple est le suivant :
smawley, andy
smiley, allen
smithhern, anne |
|
* (astérisque) |
Représente zéro, un ou plusieurs caractères, quels qu'ils soient. La ligne de commande :
awk '/a.*e/' fichier d'essai
imprime sur la sortie standard tous les enregistrements dans lesquels les caractères a et e sont séparés par zéro, un ou plusieurs caractères. Le résultat de cet exemple est le suivant :
smawley, andy
smiley, allen
smithhern, anne
smitters, alexis |
|
\ (barre oblique inversée) |
Représente le caractère d'échappement. S'il précède tout caractère à signification particulière dans les expressions régulières étendues, le caractère d'échappement l'interprète littéralement. Ainsi, la ligne de commande :
/a\/\//
correspond au modèle a //, puisque les barres obliques inversées annulent la signification normale de la barre, c'est-à-dire un délimiteur de l'expression régulière. Pour spécifier le caractère barre oblique inversée, entrez deux barres obliques inversées. Pour plus d'informations sur la barre oblique inversée et ses fonctions, voir la section suivante, consacrée aux séquences d'échappement. |
Séquences d'échappement gérées
La commande awk gère la plupart des séquences d'échappement utilisées par les conventions du langage C, ainsi que plusieurs autres séquences assimilées à des caractères spéciaux par la commande. Les séquences d'échappement sont les suivantes :
| Séquence d'échappement |
Caractère représenté |
|
\" |
\" (guillemets doubles) |
|
\/ |
/ (barre oblique) |
|
\ddd |
Caractère dont le codage est représenté par un entier octal à un, deux ou trois chiffres, où d correspond à un chiffre octal |
|
\\ |
\ (barre oblique inversée) |
|
\a |
Caractère d'alerte |
|
\b |
Caractère d'espacement arrière |
|
\f |
Caractère avance page |
|
\n |
Caractère d'avance ligne (voir remarque ci-dessous) |
|
\r |
Caractère de retour de ligne |
|
\t |
Caractère de tabulation |
|
\v |
Tabulation verticale |
Remarque :
A l'exception des fonctions intégrées gsub, match, split et sub, la mise en correspondance des expressions régulières étendues est basée sur les enregistrements en entrée. Les caractères de séparation d'enregistrements (soit le caractère d'avance ligne par défaut) ne peuvent pas être imbriqués dans l'expression et aucune expression ne correspond au caractère de séparation d'enregistrements. Si le caractère d'avance ligne ne sert pas de séparateur d'enregistrements, il est impossible de détecter une correspondance avec ce dernier. Dans les quatre fonctions intégrées spécifiées, la mise en correspondance est basée sur des chaînes texte et tout caractère (y compris le séparateur d'enregistrements) peut être imbriqué dans le modèle de sorte que celui-ci corresponde au caractère approprié. Cependant, si vous recherchez des correspondances dans des expressions régulières à l'aide de la commande awk, l'utilisation d'un ou de plusieurs caractères NULL dans le modèle donne lieu à des résultats non définis.
Expressions relationnelles
Les opérateurs relationnels < (inférieur à), > (supérieur à), <= (inférieur ou égal à), >= (supérieur ou égal à), = = (égal à) et ! = (différent de) permettent de définir des modèles. Ainsi, le modèle :
$1 < $4
met en correspondance les enregistrements dont la première zone est inférieure à la quatrième zone. Les opérateurs relationnels fonctionnent également avec les valeurs de chaîne. Exemple :
$1 =! "q"
extrait tous les enregistrements dont la première zone n'est pas un q. Vous pouvez également mettre en correspondance des valeurs de chaîne à partir de valeurs de classement. Exemple :
$1 >= "d"
met en correspondance tous les enregistrements dont la première zone débute par le caractère a, b, c ou d. Si aucune autre information n'est spécifiée, les variables de zone sont comparées en tant que valeurs de chaîne.
Combinaisons de modèles
Vous pouvez combiner les modèles à l'aide de trois options :
- Les intervalles sont spécifiés par deux modèles séparés par une virgule (,). Les actions sont exécutées sur chaque enregistrement, en commençant par celui qui correspond au premier modèle et ainsi de suite jusqu'à l'enregistrement qui correspond au second modèle. Exemple :
/begin/,/end/
met en correspondance l'enregistrement qui contient la chaîne begin, chaque enregistrement compris entre celui-ci et l'enregistrement contenant la chaîne end, ainsi que ce dernier .
- Les parenthèses ( ) permettent de regrouper les modèles.
- Les opérateurs booléens || (ou), && (et) et ! (pas) combinent les modèles pour former des expressions mises en correspondance si elles sont vraies. Si tel n'est pas le cas, aucune correspondance n'est établie.
Ainsi, le modèle :
$1 == "al" && $2 == "123"
met en correspondance les enregistrements dont la première zone contient al et la deuxième zone, 123.
Modèles BEGIN et END
Les actions spécifiées par le modèle BEGIN sont exécutées avant la lecture de toute entrée. Celles indiquées par le modèle END sont exécutées après la lecture de toute entrée. Les modèles BEGIN et END multiples sont autorisés et traités dans l'ordre défini. Un modèle END peut précéder un modèle BEGIN dans les instructions du programme.
Si un programme n'est composé que d'instructions BEGIN, les actions sont exécutées et aucune entrée n'est lue. Si un programme n'est composé que d'instructions END, toutes les entrées sont lues avant l'exécution des actions.
Actions
Il existe plusieurs types d'instructions d'action :
Instructions d'action
Les instructions d'action sont entourées d'accolades ({ }). Si les instructions sont spécifiées sans modèle, elles sont exécutées sur chaque enregistrement. Vous pouvez spécifier plusieurs actions au sein des accolades, mais vous devez les séparer par un caractère d'avance ligne ou un point-virgule (;) et les instructions sont traitées dans l'ordre dans lequel elles apparaissent.
Parmi les instructions d'action figurent :
- Instructions arithmétiques
- Les opérateurs mathématiques + (plus), - (moins), / (division), ^ (élévation à une puissance),
* (multiplication), % (modulo) sont utilisés comme suit :
Expression Opérateur Expression
Ainsi, l'instruction :
$2 = $1 ^ 3
attribue la valeur de la première zone élevée à la puissance trois à la deuxième zone.
- Instructions unaires
- Les instructions unaires - (moins) et + (plus) fonctionnent comme dans le langage de programmation C :
+Expression ou -Expression
- Instructions de type incrément ou décrément
- Les instructions de préincrément et prédécrément fonctionnent comme dans le langage de programmation C :
++Variable ou --Variable
Les instructions de postincrément et postdécrément fonctionnent comme dans le langage de programmation C :
Variable++ ou Variable--
- Instructions d'affectation
- Les opérateurs d'affectation += (addition), -= (soustraction), /= (division),
et *= (multiplication) fonctionnent comme dans le langage de programmation C, comme suit :
Variable += Expression
Variable -= Expression
Variable /= Expression
Variable *= Expression
Ainsi, l'instruction :
$1 *= $2
multiplie la variable de zone $1 par la variable de zone $2, puis attribue la nouvelle valeur à $1.
Le format des opérateurs d'affectation ^= (élévation à une puissance) et %= (modulo) est le suivant :
Variable1^=Expression1
ET
Variable2%=Expression2
Ils sont équivalents aux instructions du langage de programmation C suivantes :
Variable1=pow(Variable1, Expression1)
ET
Variable2=fmod(Variable2, Expression2)
où pow est le sous-programme pow et fmod, le sous-programme fmod.
- Instructions de concaténation de chaîne
- Pour concaténer les valeurs de chaîne, il convient de les indiquer côte à côte. Exemple :
$3 = $1 $2
affecte la concaténation des chaînes figurant dans les variables de zone $1 et $2 à la variable de zone $3.
Fonctions intégrées
Le langage de la commande awk utilise des fonctions arithmétiques, des fonctions de chaîne et des fonctions générales. L'instruction de fermeture d'un sous-programme est requise si vous souhaitez écrire les données dans un fichier, puis lire celui-ci ultérieurement dans le même programme.
Fonctions arithmétiques
Les fonctions arithmétiques suivantes exécutent les mêmes actions que les sous-programmes du langage C du même nom :
| Fonction |
Action |
|
atan2( y, x ) |
Renvoie l'arctangente de y/x. |
|
cos( x ) |
Renvoie le cosinus de x ; x est exprimé en radians. |
|
sin( x ) |
Renvoie le sinus de x ; x est exprimé en radians. |
|
exp( x ) |
Renvoie la fonction exponentielle de x. |
|
log( x ) |
Renvoie le logarithme népérien de x. |
|
sqrt( x ) |
Renvoie la racine carrée de x. |
|
int( x ) |
Renvoie la valeur de x sans décimales. |
|
rand( ) |
Renvoie un nombre aléatoire n (0 <= n < 1). |
|
srand( [Expr] ) |
Règle la valeur de départ de la fonction rand sur la valeur du paramètre Expr ou utilise l'heure si le paramètre Expr n'est pas spécifié. La valeur de départ précédente est renvoyée. |
Fonctions de chaîne
Les fonctions de chaîne sont les suivantes :
| Fonction |
Action |
|
gsub( Ere, Rempl, [ In ] ) |
Fonctionne comme la fonction sub, sauf que chaque occurrence de l'expression régulière est remplacée. |
|
sub( Ere, Rempl, [ In ] ) |
Remplace la première occurrence de l'expression régulière étendue spécifiée par le paramètre Ere dans la chaîne spécifiée par le paramètre In par la chaîne spécifiée par le paramètre Rempl. La fonction sub renvoie le nombre de substitutions. Une perluète (&) insérée dans la chaîne spécifiée par le paramètre Rempl est remplacée par la chaîne indiquée dans le paramètre In qui correspond à l'expression régulière étendue spécifiée par le paramètre Ere.
Si aucun paramètre In n'est défini, la valeur par défaut est l'enregistrement entier (soit la variable d'enregistrement $0). |
|
index( Chaîne1, Chaîne2 ) |
Renvoie la position, numérotée à partir de 1, dans la chaîne spécifiée par le paramètre Chaîne1, de la chaîne spécifiée par le paramètre Chaîne2. Si le paramètre Chaîne2 n'existe pas dans le paramètre Chaîne1, un zéro ( 0) est renvoyé. |
|
length [(Chaîne)] |
Renvoie la longueur, exprimée en caractères, de la chaîne spécifiée par le paramètre Chaîne. Si aucun paramètre Chaîne n'est défini, la longueur de l'enregistrement entier (la variable d'enregistrement $0) est renvoyée. |
|
blength [(Chaîne)] |
Renvoie la longueur, exprimée en octets, de la chaîne spécifiée par le paramètre Chaîne. Si aucun paramètre Chaîne n'est défini, la longueur de l'enregistrement entier (la variable d'enregistrement $0) est renvoyée. |
|
substr( Chaîne, M, [ N ] ) |
Renvoie une sous-chaîne composée du nombre de caractères spécifié par le paramètre N. La sous-chaîne est extraite de la chaîne spécifiée par le paramètre Chaîne, à partir du caractère figurant à la position spécifiée par le paramètre M. Le paramètre M est associé au premier caractère du paramètre Chaîne et correspond à 1. Si le paramètre N n'est pas défini, la longueur de la sous-chaîne est comptée à partir de la position spécifiée par le paramètre M jusqu'à la fin du paramètre Chaîne. |
|
match( Chaîne, Ere ) |
Renvoie la position, exprimée en caractères et à compter de 1, dans la chaîne spécifiée par le paramètre Chaîne, de l'expression régulière étendue spécifiée par le paramètre Ere ou renvoie un zéro (0) si le paramètre Ere n'est pas défini. La variable spéciale RSTART est réglée sur la valeur renvoyée. La variable spéciale RLENGTH est réglée sur la longueur de la chaîne mise en correspondance ou sur -1 (moins un) si aucune correspondance n'est détectée. |
|
split( Chaîne, A, [Ere] ) |
Divise la chaîne spécifiée par le paramètre Chaîne en éléments de tableau A[1], A[2],
. . ., A[n] et renvoie la valeur de la variable n. La division est basée sur l'expression régulière étendue spécifiée par le paramètre Ere ou sur le séparateur de zone en cours (soit la variable spéciale FS) si le paramètre Ere n'est pas spécifié. Les éléments du tableau A possèdent des valeurs de chaîne, sauf si le contexte indique qu'un élément déterminé doit aussi avoir une valeur numérique. |
|
tolower( Chaîne ) |
Renvoie la chaîne spécifiée par le paramètre Chaîne, chaque majuscule de la chaîne étant remplacée par une minuscule. Le mappage des majuscules et minuscules est défini par la catégorie LC_CTYPE de l'environnement local en cours. |
|
toupper( Chaîne ) |
Renvoie la chaîne spécifiée par le paramètre Chaîne, chaque minuscule de la chaîne étant remplacée par une majuscule. Le mappage des majuscules et minuscules est défini par la catégorie LC_CTYPE de l'environnement local en cours. |
|
sprintf(Format, Expr, Expr, . . . ) |
Met en forme les expressions spécifiées par les paramètres Expr en fonction de la chaîne de format du sous-programme printf spécifiée par le paramètre Format et renvoie la chaîne résultante. |
Fonctions générales
Les fonctions générales sont les suivantes :
| Fonction |
Action |
|
close( Expression ) |
Ferme le fichier ou le canal ouvert par une instruction print ou printf ou un appel de la fonction getline contenant le paramètre Expression associé à la même valeur de chaîne.
Si la fermeture du fichier ou du canal aboutit, un 0 est renvoyé. Dans le cas contraire, une valeur autre que zéro est renvoyée. L'instruction close est requise si vous voulez écrire les données dans un fichier, puis lire celui-ci ultérieurement dans le même programme. |
|
system(Commande ) |
Exécute la commande spécifiée par le paramètre Commande et renvoie son état de sortie. Equivalent au sous-programme system. |
|
Expression | getline [ Variable ] |
Lit un enregistrement en entrée à partir d'un flux extrait de la sortie de la commande spécifiée par le paramètre Expression et affecte la valeur de l'enregistrement à la variable spécifiée par le paramètre Variable. S'il n'est pas actuellement ouvert, le flux est créé et le nom de la commande correspondante est réglé sur la valeur du paramètre Expression. Le flux créé est équivalent au flux généré par un appel du sous-programme popen, le paramètre Commande prenant la valeur du paramètre Expression et le paramètre Mode étant réglé sur la valeur r. Chaque appel suivant de la fonction getline lit un autre enregistrement, sous réserve que le flux demeure ouvert et que le paramètre Expression se réfère à la même chaîne. Si aucun paramètre Variable n'est spécifié, la variable d'enregistrement $0 et la variable spéciale NF sont réglées sur l'enregistrement extrait du flux. |
|
getline [ Variable ] < Expression |
Lit l'enregistrement en entrée suivant du fichier indiqué par le paramètre Expression et règle la variable spécifiée par le paramètre Variable sur la valeur de l'enregistrement. Chaque appel suivant de la fonction getline lit un autre enregistrement, sous réserve que le flux demeure ouvert et que le paramètre Expression se réfère à la même chaîne. Si aucun paramètre Variable n'est spécifié, la variable d'enregistrement $0 et la variable spéciale NF sont réglées sur l'enregistrement extrait du flux. |
|
getline [ Variable ] |
Règle la variable spécifiée par le paramètre Variable sur l'enregistrement suivant extrait du fichier en entrée en cours. Si aucun paramètre Variable n'est spécifié, la variable d'enregistrement $0 est réglée sur la valeur de l'enregistrement et les variables spéciales NF, NR et FNR sont également définies. |
Remarque :
Toutes les formes de la fonction getline renvoient 1 en cas d'entrée réussie, zéro pour une fin de fichier et -1 en cas d'erreur.
Fonctions définies par l'utilisateur
Les fonctions définies par l'utilisateur sont déclarées au format suivant :
Nom de fonction (Paramètre, Paramètre,...) { Instructions }
Un programme de la commande awk peut faire référence à une fonction à tout moment et l'utilisation de cette dernière peut précéder sa définition. La portée de la fonction est globale.
Les paramètres d'une fonction sont scalaires ou tabulaires. Les paramètres sont propres à la fonction, mais toutes les autres variables sont globales. N'attribuez pas le même nom à des entités distinctes. Un paramètre ne doit par exemple pas porter le même nom qu'une fonction ou qu'une variable spéciale. Les variables à portée globale ne doivent pas porter le même nom qu'une fonction. Les scalaires et les tableaux ne doivent pas porter le même nom si leur portée est identique.
Le nombre de paramètres compris dans la définition d'une fonction ne correspond pas nécessairement au nombre de paramètres utilisés lorsque la fonction est appelée. Vous pouvez utiliser d'autres paramètres formels en tant que variables locales. Les paramètres scalaires supplémentaires possèdent à l'initialisation une valeur de chaîne équivalente à la chaîne vide et une valeur numérique égale à zéro (0). Les paramètres tabulaires supplémentaires sont initialisés en tant que tableaux vides.
Lorsqu'une fonction est appelée, aucun blanc n'est inséré entre son nom et la parenthèse ouvrante. Les appels de fonction peuvent être imbriqués et récursifs.
Lorsqu'elles sont renvoyées par tout appel de fonction imbriqué ou récursif, les valeurs des paramètres de la fonction ne sont pas modifiées, à l'exception des paramètres tabulaires passés à titre de référence. L'instruction return peut être utilisée pour renvoyer une valeur.
Au sein d'une définition de fonction, les caractères d'avance ligne sont facultatifs avant l'accolade ouvrante ({) et après l'accolade fermante (}).
Exemple de définition de fonction :
function average ( g,n)
{
for (i in g)
sum=sum+g[i]
avg=sum/n
return avg
}
Un tableau, g, et une variable, n, ainsi que le nombre d'éléments que contient le tableau, sont passés à la fonction average. Celle-ci obtient alors une moyenne et la renvoie.
Instructions conditionnelles
La plupart des instructions conditionnelles en langage de programmation de la commande awk gèrent les mêmes syntaxe et fonction que les instructions conditionnelles en langage de programmation C. Toutes les instructions conditionnelles peuvent être regroupées à l'aide d'accolades ({ }). Vous pouvez utiliser en option un caractère d'avance ligne entre la section expression et la section instruction de l'instruction conditionnelle. Les caractères d'avance ligne et les points-virgules (;) permettent de séparer plusieurs instructions dans des accolades ({ }). Les six instructions conditionnelles en langage C sont :
| Instruction conditionnelle |
Syntaxe ou description |
|
if |
if ( Expression ) { Instruction } [ else Action ] |
|
while |
while ( Expression ) { Instruction } |
|
for |
for ( Expression ; Expression ; Expression ) { Instruction } |
|
break |
Entraîne la fin de l'itération du programme lorsque l'instruction break est utilisée dans une instruction while ou for. |
|
continue |
Entraîne l'activation de l'itération suivante du programme lorsque l'instruction continue est utilisée dans une instruction while ou for. |
Les cinq instructions conditionnelles en langage de programmation de la commande awk qui ne respectent pas les règles du langage C sont :
| Instruction conditionnelle |
Syntaxe ou description |
|
for...in |
for ( Variable in Tableau ) { Instruction }
L'instruction for...in règle le paramètre Variable sur chaque valeur d'index de la variable Tableau (successivement et dans un ordre aléatoire), et exécute l'action spécifiée par le paramètre Instruction à chaque itération. Pour obtenir un exemple d'instruction for...in, voir instruction delete. |
|
if...in |
if ( Variable in Tableau ) { Instruction }
L'instruction if...in vérifie l'existence de l'élément Tableau. Elle est exécutée si l'élément Tableau est détecté. |
|
delete |
delete Tableau [ Expression ]
L'instruction delete supprime à la fois le tableau spécifié par le paramètre Tableau et l'index spécifié par le paramètre Expression. Ainsi, les instructions :
for (i in g)
delete g[i];
suppriment chaque élément du tableau g[]. |
|
exit |
exit [ Expression ]
L'instruction exit appelle d'abord toutes les actions END dans l'ordre de leur exécution, puis arrête la commande awk dans l'état de sortie spécifié par le paramètre Expression. Aucune autre action END n'est appelée si l'instruction exit se produit dans le cadre d'une action END. |
|
# |
# Commentaire
L'instruction # place les commentaires. Ceux-ci doivent systématiquement se terminer par un caractère d'avance ligne, mais peuvent être insérés n'importe où sur une ligne. |
|
next |
Arrête le traitement de l'enregistrement en entrée en cours et passe à l'enregistrement en entrée suivant. |
Instructions de sortie
Les deux instructions de sortie du langage de programmation de la commande awk sont :
| Instruction de sortie |
Syntaxe et description |
|
print |
print [ ListeExpressions ] [ Redirection ]
[ Expression ]
L'instruction print écrit la valeur de chaque expression spécifiée par le paramètre ListeExpressions sur la sortie standard. Les expressions sont séparées par la valeur en cours de la variable spéciale OFS et chaque enregistrement est terminé par la valeur en cours de la variable spéciale ORS.
La sortie peut alors être réacheminée par le biais du paramètre Redirection, qui peut spécifier les trois redirections de sortie à l'aide de > (supérieur à), >> (deux fois supérieur à) et | (barre verticale). Le paramètre Redirection indique comment la sortie est réacheminée et le paramètre Expression correspond soit à un chemin de fichier (si le paramètre Redirection est > ou >> ), soit à une commande (si le paramètre Redirection est | ). |
|
printf |
printf Format [ , ListeExpressions ] [ Redirection ] [ Expression ]
L'instruction printf écrit dans la sortie standard les expressions spécifiées par le paramètre ListeExpressions au format spécifié par le paramètre Format. L'instruction printf fonctionne comme la commande printf, à l'exception de la spécification de conversion c (%c). Les paramètres Redirection et Expression fonctionnent comme dans l'instruction print.
En ce qui concerne la spécification de conversion c : si l'argument a une valeur numérique, le caractère dont le codage est réglé sur cette valeur est généré en sortie.
Si la valeur correspond à zéro ou qu'elle n'est pas le codage d'un élément du jeu de caractères, le comportement n'est pas défini. Si l'argument n'a pas de valeur numérique, le premier caractère de la chaîne est généré en sortie. Si la chaîne ne contient pas de caractère, le comportement n'est pas défini. |
Remarque :
Si le paramètre Expression associe un chemin au paramètre Redirection, celui-ci doit être mis entre guillemets pour s'assurer qu'il soit traité comme une chaîne.
Variables
Les variables peuvent être de type scalaire, zone, tabulaire ou spécial.
Leur nom ne doit pas débuter par un chiffre.
Vous pouvez simplement les référencer pour les utiliser. A l'exception des paramètres de fonction, elles ne sont pas explicitement déclarées. Les variables scalaires et les éléments de tableau non initialisés possèdent tous deux la valeur numérique zéro (0) et une valeur de chaîne égale à celle de la chaîne vide (" ").
Selon le contexte, les variables gèrent les valeurs numériques ou de chaîne. Chaque variable peut avoir une valeur numérique, une valeur de chaîne ou les deux à la fois. Exemple :
x = "4" + "8"
affecte la valeur 12 à la variable x. Pour les constantes de chaîne, les expressions
doivent être mises entre guillemets (" ").
Il ne se produit aucune conversion explicite entre les nombres et les chaînes. Pour imposer le traitement d'une expression comme un nombre, ajoutez-lui zéro (0). Pour imposer le traitement d'une expression comme une chaîne, ajoutez une chaîne vide (" ").
Variables de zone
Les variables de zone sont désignées par le symbole du dollar ($) suivi d'un nombre ou d'une expression numérique. La variable $1 correspond à la première zone d'un enregistrement, la variable $2 à la deuxième zone, et ainsi de suite. La variable de zone $0 est affectée à l'enregistrement entier. Pour créer une variable de zone, affectez-lui une valeur. Affecter une valeur à une zone non existante, soit une zone supérieure à la valeur actuelle de la variable de zone $NF, impose la création des zones comprises entre les deux valeurs (réglées sur la chaîne vide), augmente la valeur de la variable spéciale NF et force la variable d'enregistrement $0 à être recalculée. Les nouvelles zones sont séparées par le séparateur de zone en cours (qui correspond à la valeur de la variable spéciale FS). Les séparateurs de zone par défaut sont le caractère blanc et la tabulation. Pour modifier le caractère défini, utilisez l'option -F ou affectez à la variable spéciale FS une autre valeur dans le programme de la commande awk.
Tableaux
Les tableaux sont initialement vides et leur taille est modifiée dynamiquement.
Ils sont représentés par une variable à indice entre crochets ([ ]).
Les indices, ou identificateur d'élément, peuvent être des nombres de chaînes, qui proposent un type de fonction de tableau associatif. Ainsi, le programme :
/red/ { x["red"]++ }
/green/ { y["green"]++ }
incrémente le nombre de compteurs red et de compteurs green.
Plusieurs indices peuvent être affectés aux tableaux, à l'instar des tableaux multidimensionnels dans certains langages de programmation. Puisque les tableaux de programmation de la commande awk sont monodimensionnels, les indices séparés par une virgule sont convertis en une chaîne unique en concaténant les valeurs de chaîne des expressions distinctes, chaque expression étant séparée par la valeur de la variable d'environnement SUBSEP. De ce fait, les deux opérations d'index suivantes sont équivalentes :
x[expr1, expr2,...exprn]
ET
x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]
Si vous utilisez l'opérateur in, une valeur Index multidimensionnelle doit être mise entre parenthèses. A l'exception de l'opérateur in, toute référence à un élément de tableau non existant entraîne automatiquement sa création.
Variables spéciales
Les variables spéciales suivantes ont une signification particulière pour la commande awk :
| Variable spéciale |
Description |
|
ARGC |
Nombre d'éléments du tableau ARGV. Cette valeur peut être modifiée. |
|
ARGV |
Tableau dont chaque membre contient l'une des variables Fichier ou Affectation, extrait dans l'ordre défini par la ligne de commande et numéroté de 0 (zéro) à ARGC -1. Lorsqu'un fichier en entrée est traité, le membre suivant du tableau ARGV fournit le nom du fichier en entrée suivant, sauf dans les cas de figure suivants :
-
Le membre suivant est une instruction Affectation, auquel cas l'affectation est évaluée.
-
Le membre suivant a une valeur NULL, auquel cas il n'est pas pris en compte. Pour sauter un fichier en entrée sélectionné, les programmes règlent le membre du tableau ARGV contenant ce fichier en entrée sur une valeur NULL.
-
Le membre suivant correspond à la valeur actuelle de ARGV [ARGC -1], que la commande awk interprète comme la fin des fichiers en entrée.
|
|
CONVFMT |
Le format printf de conversion des nombres en chaînes (à l'exception des instructions de sortie, qui utilisent la variable spéciale OFMT). La valeur par défaut est "%.6g". |
|
ENVIRON |
Tableau représentant l'environnement d'exécution de la commande awk. Le format de chaque élément du tableau est le suivant :
ENVIRON [ "NomVariableEnvironnement" ] = ValeurVariableEnvironnement
Les valeurs sont définies lorsque l'exécution de la commande awk débute et cet environnement est utilisé jusqu'à la fin de l'opération, même si la variable spéciale ENVIRON est modifiée. |
|
FILENAME |
Indique le chemin du fichier en entrée en cours. Lors de l'exécution d'une action BEGIN, la valeur de FILENAME n'est pas définie. Lors de l'exécution d'une action END, la valeur correspond au nom du dernier fichier en entrée traité. |
|
FNR |
Indique le numéro de l'enregistrement en entrée en cours dans le fichier en cours. |
|
FS |
Indique le séparateur de zone d'entrée. La valeur par défaut est un blanc. Si cette valeur est utilisée, les zones peuvent être séparées par tout nombre d'espaces définis dans l'environnement local. La variable spéciale FS gère deux valeurs supplémentaires :
-
Si FS est réglée sur un caractère unique, les zones sont séparées par une occurrence unique du caractère.
-
Si FS est réglée sur une expression régulière étendue, chaque occurrence d'une séquence correspondant à celle-ci sépare les zones.
|
|
NF |
Nombre de zones que contient l'enregistrement en cours, à concurrence de 99. Au sein d'une action BEGIN, la variable spéciale NF n'est pas définie, à moins qu'une fonction getline sans paramètre Variable n'ait été définie précédemment. Au sein d'une action END, la variable spéciale NF conserve la valeur utilisée pour la lecture du dernier enregistrement, à moins qu'une fonction ultérieure réacheminée getline sans paramètre Variable ne soit définie avant l'exécution de l'action END. |
|
NR |
Indique le numéro de l'enregistrement en entrée en cours. Au sein d'une action BEGIN, la valeur de la variable spéciale NR est réglée sur 0 (zéro). Au sein d'une action END, la valeur correspond au numéro du dernier enregistrement traité. |
|
OFMT |
Indique le format printf utilisé pour convertir les nombres en chaînes dans les instructions de sortie. La valeur par défaut est "% .6g". |
|
OFS |
Indique le séparateur de zones de sortie (la valeur par défaut est un espace). |
|
ORS |
Indique le séparateur d'enregistrements de sortie (la valeur par défaut est un caractère d'avance ligne). |
|
RLENGTH |
Indique la longueur de la chaîne mise en correspondance par la fonction match. |
|
RS |
Indique le séparateur d'enregistrements en entrée (la valeur par défaut est un caractère d'avance ligne). Si la variable spéciale RS est NULL, les enregistrements sont séparés par des séquences d'une ou de plusieurs lignes vides. Les lignes vides de début ou de fin n'entraînent pas la création d'enregistrements vides au début ou à la fin de l'entrée. Le caractère d'avance ligne est systématiquement un séparateur de zones, quelle que soit la valeur de la variable spéciale FS. |
|
RSTART |
Indique la position initiale de la chaîne mise en correspondance par la fonction match, numérotée à partir de 1. Cette variable est équivalente à la valeur renvoyée par la fonction match. |
|
SUBSEP |
Sépare plusieurs indices. La valeur par défaut est \031. |
Options
|
-f FichierProgramme |
Extrait des instructions relatives à la commande awk du fichier spécifié par la variable FichierProgramme. Si l'option -f est spécifiée plusieurs fois, les fichiers concaténés, dans l'ordre indiqué, seront utilisés en tant qu'instructions. |
|
-F Ere |
Utilise l'expression régulière étendue spécifiée par la variable Ere en tant que séparateur de zones. Le séparateur de zones par défaut est un blanc. |
|
-v Affectation |
Affecte une valeur à une variable pour le langage de programmation de la commande awk. Le paramètre Affectation est exprimé au format Nom = Valeur. La section Nom définit le nom de la variable et peut correspondre à toute combinaison de traits de soulignement, chiffres et caractères alphabétiques, mais elle doit débuter par un caractère alphabétique ou un trait de soulignement. La section Valeur est également composée de traits de soulignement, chiffres et caractères alphabétiques, et est traitée comme si elle était précédée et suivie d'un guillemet (", similaire à une valeur de chaîne). Si la section Valeur est numérique, la valeur numérique est également affectée à la variable.
L'affectation définie par l'option -v se produit avant l'exécution de toute section du programme de la commande awk, y compris la section BEGIN. |
|
Affectation |
Affecte une valeur à une variable pour le langage de programmation de la commande awk. Son format et sa fonction sont identiques à ceux de la variable Affectation associée à l'option -v, à l'exception de l'heure de traitement. Le paramètre Affectation est traité juste avant le fichier en entrée (spécifié par la variable Fichier) qui le suit sur la ligne de commande. Si le paramètre Affectation est spécifié juste avant le premier fichier en entrée de la liste, les affectations sont traitées juste après les sections BEGIN (si elles existent). Si un paramètre Affectation est défini après le dernier fichier, l'affectation est traitée avant les sections END, si elles existent. Si aucun fichier en entrée n'est défini, les affectations sont traitées et l'entrée standard est lue. |
|
Fichier |
Définit le nom du fichier qui contient les données à traiter.
Si aucune variable Fichier n'est définie ou si un signe moins (-) est spécifié, l'entrée standard est traitée. |
|
'Programme' |
Contient les instructions relatives à la commande awk.
Si l'option -f n'est pas définie, la variable Programme doit être en première position sur la ligne de commande. Elle doit être entourée de guillemets simples (' '). |
Etat de sortie
Cette commande renvoie les valeurs de sortie suivantes :
|
0 |
L'opération a abouti. |
|
>0 |
Il s'est produit une erreur. |
Exemples
- Pour afficher les lignes d'un fichier qui excèdent 72 caractères, entrez :
awk 'length >72' chapitre1
Cette commande sélectionne chaque ligne du fichier chapitre1 qui excède 72 caractères et les écrit sur la sortie standard, car aucune action n'est définie. Un caractère de tabulation a une valeur d'un octet.
- Pour afficher toutes les lignes qui séparent les mots start et stop, y compris "start" et "stop", entrez :
awk '/start/,/stop/' chapitre1
- Pour exécuter un programme de la commande awk, sum2.awk, qui traite le fichier chapitre1, entrez :
awk -f sum2.awk chapitre1
Le programme suivant, sum2.awk, calcule la somme et la moyenne des nombres de la deuxième colonne du fichier en entrée, chapitre1 :
{
sum += $2
}
END {
print "Sum: ", sum;
print "Average:", sum/NR;
} La première action ajoute la valeur de la deuxième zone de chaque ligne à la variable sum. Toutes les variables sont réglées sur la valeur numérique zéro (0) lorsqu'elles sont référencées pour la première fois. Le modèle END placé avant la deuxième action entraîne l'exécution de ces actions après la lecture entière du fichier en entrée. La variable spéciale NR, utilisée pour calculer la moyenne, définit le nombre d'enregistrements lus.
- Pour imprimer les deux premières zones dans un ordre inversé, entrez :
awk '{ print $2, $1 }' chapitre1
- Le programme awk suivant
awk -f sum3.awk chapitre2
imprime les deux premières zones du fichier chapitre2, les zones d'entrée étant séparées par une virgule et/ou des blancs et des tabulations, puis calcule la somme des valeurs de la première colonne et imprime la somme et la moyenne :
BEGIN {FS = ",|[ \t]+"}
{print $1, $2}
{s += $1}
END {print "sum is",s,"average is", s/NR }
Rubriques connexes
Commandes grep et sed.