commande awk
Objectif
Recherche les lignes dans les fichiers qui correspondent à un modèle et exécute des actions spécifiées sur ces lignes.
Syntaxe
awk [ -u ] [ -F Ere ] [ -v Affectation ] ... { -f ProgramFile | 'Programme' } [ [ Fichier ... | Affectation ... ] ] ...
Descriptif
La commande Awk utilise un ensemble d'instructions fournies par l'utilisateur pour comparer un ensemble de fichiers, une ligne à la fois, à des expressions régulières étendues fournies par l'utilisateur. Les actions sont ensuite effectuées sur n'importe quelle ligne qui correspond aux expressions régulières étendues.
La recherche de modèle de la commande Awk est plus générale que celle de la commande Grep , et elle permet à l'utilisateur d'effectuer plusieurs actions sur des lignes de texte d'entrée. Le langage de programmation de commande Awk ne nécessite aucune compilation et permet à l'utilisateur d'utiliser 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 d'environnement LANG, LC_ALL, LC_COLLATE, TYPE_LOGIQUE, LC_MESSAGES, LC_NUMÉRIQUE, CHEMIN D'ACCÈS NLSPATHet CHEMIN .
Les sujets suivants sont abordés dans cet article:
Entrée pour la commande awk
La commande Awk prend deux types d'entrée: les fichiers texte d'entrée et les instructions de programme.
Fichiers texte en entrée
La recherche et les actions sont effectuées sur les fichiers texte en entrée. Les fichiers sont spécifiés par:
- Spécification de la variable Fichier sur la ligne de commande.
- Modification des variables spéciales ARGV et ARGC.
- Fourniture d'une entrée standard en l'absence de la variable Fichier .
Si plusieurs fichiers sont spécifiés avec la variable Fichier , les fichiers sont traités dans l'ordre spécifié.
Instructions de programme
Les instructions fournies par l'utilisateur contrôlent les actions de la commande Awk . Ces instructions proviennent de la variable ` Program'sur la ligne de commande ou d'un fichier spécifié par l'indicateur -f avec la variable ProgramFile . Si plusieurs fichiers programme sont spécifiés, les fichiers sont concaténés dans l'ordre spécifié et l'ordre des instructions qui en résulte est utilisé.
Sortie de la commande awk
La commande Awk génère trois types de sortie à partir des données du fichier texte en entrée:
- Les données sélectionnées peuvent être imprimées dans une sortie standard, sans modification du fichier d'entrée.
- Certaines parties du fichier d'entrée peuvent être modifiées.
- Les données sélectionnées peuvent être modifiées et imprimées en sortie standard, avec ou sans modification du contenu du fichier en entrée.
Tous ces types de sortie peuvent être exécutés sur le même fichier. Le langage de programmation reconnu par la commande Awk permet à l'utilisateur de rediriger la sortie.
Traitement des fichiers avec les enregistrements et les zones
Les fichiers sont traités de la manière suivante:
- La commande Awk analyse ses instructions et exécute les actions spécifiées pour se produire avant la lecture du fichier d'entrée.
L'instruction DÉBUT dans le langage de programmation Awk permet à l'utilisateur de spécifier un ensemble d'instructions à effectuer avant la lecture du premier enregistrement. Ceci est particulièrement utile pour l'initialisation des variables spéciales.
- Un enregistrement est lu à partir du fichier d'entrée.
Un enregistrement est un ensemble de données séparées par un séparateur d'enregistrement. La valeur par défaut du séparateur d'enregistrement est le caractère de nouvelle ligne, ce qui fait que chaque ligne du fichier est un enregistrement distinct. Le séparateur d'enregistrements peut être modifié en définissant la variable spéciale R .
- L'enregistrement est comparé à chaque modèle spécifié par les instructions de la commande Awk .
Les instructions de commande peuvent indiquer qu'un champ spécifique de l'enregistrement doit être comparé. Par défaut, les zones sont séparées par un espace blanc (blancs ou tabulations). Chaque zone est désignée par une variable de zone. La première zone d'un enregistrement est affectée à la variable $1 , la deuxième zone est affectée à la variable $2 , et ainsi de suite. L'enregistrement complet est affecté à la variable $0 . Le séparateur de zone peut être modifié à l'aide de l'indicateur -F sur la ligne de commande ou en définissant Variable spéciale F. La variable spéciale F peut être définie sur les valeurs suivantes: blanc, caractère unique ou Expression régulière étendue.
- Si l'enregistrement correspond à un modèle, les actions associées à ce modèle sont exécutées dans l'enregistrement.
- Une fois que l'enregistrement est comparé à chaque modèle et que toutes les actions spécifiées sont exécutées, l'enregistrement suivant est lu à partir de l'entrée ; le processus est répété jusqu'à ce que tous les enregistrements soient lus à partir du fichier d'entrée.
- Si plusieurs fichiers d'entrée ont été spécifiés, le fichier suivant est alors ouvert et le processus se répète jusqu'à ce que tous les fichiers d'entrée aient été lus.
- Une fois que le dernier enregistrement du dernier fichier est lu, la commande Awk exécute les instructions spécifiées après le traitement de l'entrée.
L'instruction FIN dans le langage de programmation Awk permet à l'utilisateur de spécifier les actions à effectuer après la lecture du dernier enregistrement. Ceci est particulièrement utile pour l'envoi de messages sur le travail effectué par la commande Awk .
Le langage de programmation de commandes awk
Le langage de programmation de commande Awk est constitué d'instructions sous la forme:
Modèle { Action }
Si un enregistrement correspond au modèle spécifié ou contient une zone qui correspond au modèle, l'action associée est alors effectuée. Un modèle peut être spécifié sans action, auquel cas la totalité de la ligne contenant le modèle est écrite dans la sortie standard. Une action spécifiée sans modèle est effectuée pour chaque enregistrement d'entrée.
Schémas
Il existe quatre types de canevas utilisés dans la syntaxe de langage de commande Awk :
expressions régulières
Les expressions régulières étendues utilisées par la commande Awk sont similaires à celles utilisées par la commande Grep ou Egrep . La forme la plus simple d'une expression régulière étendue est une chaîne de caractères entre des barres obliques. Par exemple, supposons qu'un fichier nommétestfileA le contenu suivant:
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexisSaisie de la ligne de commande suivante:
awk '/smi/' testfileImprimer dans la sortie standard de tous les enregistrements contenant une occurrence de la chaînesmi. Dans cet exemple, le programme'/smi/'Pour la commande Awk est un modèle sans action. La sortie est la suivante:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexisLes caractères spéciaux suivants sont utilisés pour former des expressions régulières étendues:
| Caractère | Fonction |
|---|---|
| + | Indique qu'une chaîne correspond si une ou plusieurs occurrences du caractère ou de l'expression régulière étendue précédant le + (plus) sont dans la chaîne. Ligne de commande:Imprime sur la sortie standard tout enregistrement contenant une chaîne avec les caractèressmit, suivi d'un ou de plusieursh, puis se terminant par les caractèresern. Dans cet exemple, la sortie est la suivante: |
| ? | Indique qu'une chaîne correspond à zéro ou une occurrence du caractère ou de l'expression régulière étendue qui précède le? (point d'interrogation) se trouvent dans la chaîne. Ligne de commande:Imprime sur la sortie standard de tous les enregistrements contenant les caractèressmit,Suivi de zéro ou d'une instance de lah. La sortie de cet exemple est la suivante: |
| | | Indique qu'une chaîne correspond si l'une des chaînes séparées par la | (ligne verticale) se trouve dans la chaîne. Ligne de commande:Imprime sur la sortie standard de tous les enregistrements contenant la chaîneallenoualan. Dans cet exemple, la sortie est la suivante: |
| ( ) | Regroupe les chaînes dans des expressions régulières. Ligne de commande:Imprime sur la sortie standard de tous les enregistrements avec la chaîneaeoualleouanneouallnne. Dans cet exemple, la sortie est la suivante: |
| { m } | Indique qu'une chaîne correspond si exactement les occurrences M du modèle sont dans la chaîne. Ligne de commande:Imprime sur la sortie standard |
| {m, } | Indique qu'une chaîne correspond si au moins M occurrences du modèle sont dans la chaîne. Ligne de commande:Imprime sur la sortie standard: |
| {m, n} | Indique qu'une chaîne correspond si entre M et N, inclus, les occurrences du modèle se trouvent dans la chaîne (où M < = N). Ligne de commande:Imprime sur la sortie standard: |
| [Chaîne] | Signifie que l'expression régulière correspond à tous les caractères spécifiés par la variable Chaîne entre crochets. Ligne de commande:Imprime sur la sortie standard de tous les enregistrements avec les caractèressmSuivi de n'importe quel caractère par ordre alphabétique deaàh. Dans cet exemple, la sortie est la suivante: |
| [^ Chaîne] | Un ^ (caret) au sein du [ ] (crochets) et au début de la chaîne spécifiée indique que l'expression régulière Ne fait pas correspond à tous les caractères entre crochets. Ainsi, la ligne de commande:Imprime sur la sortie standard: |
| ~,!~ | Signifie une instruction conditionnelle selon laquelle une variable spécifiée correspond (tilde) ou ne correspond pas (tilde, point d'exclamation) à l'expression régulière. Ligne de commande:Imprime sur la sortie standard de tous les enregistrements dont la première zone contient le caractèren.La sortie de cet exemple est la suivante: |
| ^ | Signifie le début d'une zone ou d'un enregistrement. Ligne de commande:Imprime sur la sortie standard de tous les enregistrements avec le caractèrehComme premier caractère du second champ. La sortie de cet exemple est la suivante: |
| $ | Signifie la fin d'une zone ou d'un enregistrement. Ligne de commande:Imprime sur la sortie standard de tous les enregistrements avec le caractèreyComme dernier caractère du second champ. La sortie de cet exemple est la suivante: |
| . (période) | Signifie n'importe quel caractère à l'exception du caractère de nouvelle ligne de terminal à la fin d'un espace. Ligne de commande:Imprime sur la sortie standard de tous les enregistrements avec les caractèresaEt séparés par deux caractères. La sortie de cet exemple est la suivante: |
| *(astérisque) | Signifie zéro ou plusieurs caractères. Ligne de commande:Imprime sur la sortie standard de tous les enregistrements avec les caractèresaEt e séparés par zéro ou plusieurs caractères. La sortie de cet exemple est la suivante: |
| \ (barre oblique inversée) | Le caractère d'échappement. Lorsqu'il précède l'un des caractères qui ont une signification particulière dans les expressions régulières étendues, le caractère d'échappement supprime toute signification particulière pour le caractère. Par exemple, la ligne de commande:Correspond au modèle a //, car les barres obliques inversées annulent la signification habituelle de la barre oblique comme délimiteur de l'expression régulière. Pour spécifier la barre oblique inversée en tant que caractère, utilisez une barre oblique inversée double. Pour plus d'informations sur la barre oblique inversée et ses utilisations, voir l'élément suivant sur les séquences d'échappement. |
Séquences d'échappement reconnues
La commande Awk reconnaît la plupart des séquences d'échappement utilisées dans les conventions de langage C, ainsi que plusieurs autres qui sont utilisées en tant que caractères spéciaux par la commande Awk elle-même. Les séquences d'échappement sont les suivantes:
| séquence d"échappement | Caractère réprésenté |
|---|---|
| \" | \" (guillemets) |
| \/ | / (barre oblique) |
| \ddd | Caractère dont le codage est représenté par un entier octal à un, deux ou trois chiffres, où D représente un chiffre octal |
| \\ | \ (barre oblique inversée) |
| \a | Caractère d'alerte |
| \b | Caractère de retour arrière |
| \f | Caractère de flux de formulaires |
| \n | Caractère de nouvelle ligne (voir remarque suivante) |
| \r | Caractère de retour chariot |
| \t | caractère de tabulation |
| \v | Onglet Vertical. |
Remarque: Sauf dans les fonctions intégrées Gsub, Correspondance, Fractionneret Sous- , la correspondance des expressions régulières étendues est basée sur les enregistrements d'entrée. Les caractères de séparation d'enregistrements (le caractère de nouvelle 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'enregistrement. Si le séparateur d'enregistrement n'est pas le caractère de nouvelle ligne, le caractère de nouvelle ligne peut être mis en correspondance. Dans les quatre fonctions intégrées spécifiées, la correspondance est basée sur des chaînes de texte, et tout caractère (y compris le séparateur d'enregistrements) peut être imbriqué dans le canevas de sorte que le modèle corresponde au caractère approprié. Toutefois, dans toutes les expressions régulières correspondant à la commande Awk , l'utilisation d'un ou de plusieurs caractères NULL dans le canevas génère 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 ! = (pas égal à) peut être utilisé pour former des modèles. Par exemple, le modèle:
$1 < $4Correspond aux enregistrements où le premier champ est inférieur à la quatrième zone. Les opérateurs relationnels fonctionnent également avec des valeurs de chaîne. Par exemple :
$1 =! "q"Correspond à tous les enregistrements dont la première zone n'est pas uneq. Les valeurs de chaîne peuvent également être associées aux valeurs de classement. Par exemple :
$1 >= "d"Correspond à tous les enregistrements dont la première zone commence par un caractèrea,b,coud. Si aucune autre information n'est donnée, les variables de champ sont comparées en tant que valeurs de chaîne.
Combinaisons de modèles
Les modèles peuvent être combinés à l'aide de trois options:
- Les plages sont spécifiées par deux modèles séparés par une, (virgule). Les actions sont exécutées sur chaque enregistrement en commençant par l'enregistrement correspondant au premier modèle, et en continu et en incluant l'enregistrement correspondant au second modèle. Par exemple :
Correspond à l'enregistrement contenant la chaînebegin, et chaque enregistrement entre celui-ci et l'enregistrement contenant la chaîneend, y compris l'enregistrement contenant la chaîneend./begin/,/end/ - Parenthèses () Les modèles de groupe.
- Les opérateurs booléens | | (ou), & & (et), et ! (non) combine des modèles dans des expressions qui correspondent si elles évaluent la valeur true, sinon elles ne correspondent pas. Par exemple, le modèle:
Correspond aux enregistrements dans lesquels la première zone estalEt la deuxième zone est123.$1 == "al" && $2 == "123"
Modèles BEGIN et END
Les actions spécifiées avec le modèle DÉBUT sont exécutées avant que n'importe quelle entrée soit lue. Les actions spécifiées avec le modèle FIN sont exécutées une fois que toutes les entrées ont été lues. Plusieurs modèles DÉBUT et FIN sont autorisés et traités dans l'ordre indiqué. Un modèle FIN peut précéder un modèle DÉBUT dans les instructions du programme. Si un programme ne contient que des instructions DÉBUT , les actions sont exécutées et aucune entrée n'est lue. Si un programme ne contient que des instructions FIN , toutes les entrées sont lues avant toute action entreprise.
Actions
Il existe plusieurs types d'instructions d'action:
- Instructions d'action
- Built-in Functions
- fonctions définies par l'utilisateur
- Conditional Statements
- Actions de sortie
Instructions d'action
Les instructions d'action sont incluses dans { } (accolades). Si les instructions sont spécifiées sans motif, elles sont exécutées sur chaque enregistrement. Plusieurs actions peuvent être spécifiées dans les accolades, mais doivent être séparées par des caractères de nouvelle ligne ou (points-virgules), et les instructions sont traitées dans l'ordre dans lequel elles apparaissent. Les énoncés d'action comprennent:
- Déclarations arithmétiques
- Les opérateurs mathématiques + (plus),-(moins), / (division), ^ (exponentiation), * (multiplication),% (modulo) sont utilisés dans le formulaire:
Expression Operator ExpressionAinsi, la déclaration:
$2 = $1 ^ 3Affecte la valeur du premier champ élevé à la troisième puissance à la deuxième zone.
- Déclarations d'annulation
- L'unaire - (moins) et l'unaire + (plus) fonctionnent comme dans le langage de programmation C:
+Expression or -Expression
- Instructions d'incrémentation et de décrémentation
- Les instructions de pré-incrémentation et de préretraite fonctionnent comme dans le langage de programmation C:
++Variable or --VariableLes instructions post-incrémentation et post-décrémentation fonctionnent comme dans le langage de programmation C:
Variable++ or Variable--
- Instructions d'affectation
- Les opérateurs d'affectation + = (addition),-= (soustraction), / = (division) et * = (multiplication) fonctionnent comme dans le langage de programmation C, avec le formulaire:
Variable += ExpressionVariable -= ExpressionVariable /= ExpressionVariable *= ExpressionPar exemple, l'instruction :
$1 *= $2Multiplie la variable de zone $1 par la variable de zone $2 , puis affecte la nouvelle valeur à $1.
Les opérateurs d'affectation ^ = (exponentiation) et% = (modulo) ont le format suivant:
Variable1^=Expression1ET
Variable2%=Expression2Et ils sont équivalents aux énoncés de langage de programmation C:
Variable1=pow(Variable1, Expression1)ET
Variable2=fmod(Variable2, Expression2)oùpowEst le sous-programme Pow etfmodEst le sous-programme Fmod .
- Instructions de concaténation de chaîne
- Les valeurs de chaîne peuvent être concaténées en les indiquant côte à côte. Par exemple :
$3 = $1 $2Affecte la concaténation des chaînes dans les variables de zone $1 et $2 à la variable de zone $3.
Built-in Functions
La langue de commande Awk utilise des fonctions arithmétiques, des fonctions de chaîne et des fonctions générales. L'instruction de fermeture de sous-programme est nécessaire si vous avez l'intention d'écrire un fichier, puis de le lire plus tard dans le même programme.
Fonctions arithmétiques
Les fonctions arithmétiques suivantes exécutent les mêmes actions que les sous-routines de langage C sous le même nom:
| Article | Descriptif |
|---|---|
| atan2( Y, X ) | Renvoie l'arc tangente de Y/X. |
| Cos ( X ) | Renvoie le cosinus de X; X est en radians. |
| Péché ( X ) | Renvoie le péché de X; X est en radians. |
| Exp ( X ) | Renvoie la fonction exponentielle de X. |
| Journal ( X ) | Renvoie le logarithme naturel de X. |
| Sqrt ( X ) | Renvoie la racine carrée de X. |
| Int ( X ) | Renvoie la valeur de X tronquée à un entier. |
| Rand ( ) | Renvoie un nombre aléatoire N, avec 0 < = N < 1. |
| Srand ( [Expr] ) | Définit la valeur de départ de la fonction Rand sur la valeur du paramètre Expr ou utilisez l'heure de la journée si le paramètre Expr est omis. La valeur de départ précédente est renvoyée. |
Fonctions de chaîne
Les fonctions de chaîne sont les suivantes:
| Article | Descriptif |
|---|---|
| Gsub ( Ere, Rép., [ Dans ] ) | Effectues exactement comme la fonction Sous- , sauf que toutes les occurrences de l'expression régulière sont remplacées. |
| Sous ( Ere, Rép., [ Dans ] ) | 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 Dans avec la chaîne spécifiée par le paramètre Rép. . La fonction Sous- renvoie le nombre de substitutions. Un & (perluète) apparaissant dans la chaîne spécifiée par le paramètre Rép. est remplacé par la chaîne dans le paramètre Dans qui correspond à l'expression régulière étendue spécifiée par le paramètre Ere . Si aucun paramètre Dans n'est spécifié, la valeur par défaut est l'intégralité de l'enregistrement (la variable d'enregistrement $0 ). |
| Index ( String1, String2 ) | Renvoie la position, à partir de 1, dans la chaîne spécifiée par le paramètre String1 où la chaîne spécifiée par le paramètre String2 se produit. Si le paramètre String2 ne se trouve pas dans le paramètre String1 , un 0 (zéro) est renvoyé. |
| Longueur [ (Chaîne)] | Renvoie la longueur, en caractères, de la chaîne spécifiée par le paramètre Chaîne . Si aucun paramètre Chaîne n'est indiqué, la longueur de l'enregistrement complet (la variable d'enregistrement $0 ) est renvoyée. |
| Blonde [ (Chaîne)] | Renvoie la longueur, en octets, de la chaîne spécifiée par le paramètre Chaîne . Si aucun paramètre Chaîne n'est indiqué, la longueur de l'enregistrement complet (la variable d'enregistrement $0 ) est renvoyée. |
| Substr ( Chaîne, M, [ N ] ) | Renvoie une sous-chaîne avec le nombre de caractères spécifié par le paramètre N . La sous-chaîne est prise à partir de la chaîne spécifiée par le paramètre Chaîne , en commençant par le caractère dans la position spécifiée par le paramètre M . Le paramètre M est indiqué avec le premier caractère du paramètre Chaîne en tant que numéro 1. Si le paramètre N n'est pas spécifié, la longueur de la sous-chaîne sera à 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, en caractères, de 1, dans la chaîne spécifiée par le paramètre Chaîne où l'expression régulière étendue spécifiée par le paramètre Ere se produit, ou renvoie 0 (zéro) si le paramètre Ere ne se produit pas. La variable spéciale RDÉMARRER est définie sur la valeur de retour. La variable spéciale RLENGTH prend la valeur de la longueur de la chaîne recherchée ou la valeur -1 (un négatif) si aucune correspondance n'est trouvée. |
| Division ( Chaîne, A, [Ere] ) | Diva la chaîne spécifiée par le paramètre Chaîne dans les éléments de tableau A[ 1 ], A[ 2 ],.. ., A[N], et renvoie la valeur de la variable N . La séparation est effectuée avec l'expression régulière étendue spécifiée par le paramètre Ere ou avec le séparateur de zone en cours (la variable spéciale F ) si le paramètre Ere n'est pas indiqué. Les éléments du tableau A sont créés avec des valeurs de chaîne, sauf si le contexte indique qu'un élément particulier doit également avoir une valeur numérique. |
| Tolower ( Chaîne ) | Renvoie la chaîne spécifiée par le paramètre Chaîne , chaque caractère en majuscules de la chaîne ayant été modifié en minuscule. Le mappage en majuscules et en minuscules est défini par la catégorie TYPE_LOGIQUE de l'environnement local en cours. |
| Toupper ( Chaîne ) | Renvoie la chaîne spécifiée par le paramètre Chaîne , chaque caractère en minuscules de la chaîne changés en majuscules. Le mappage en majuscules et en minuscules est défini par la catégorie TYPE_LOGIQUE de l'environnement local en cours. |
| Sprintf (Format, Expr, Expr, . . . ) | Formate les expressions spécifiées par les paramètres Expr en fonction de la chaîne de format de sous-routine Printf spécifiée par le paramètre Format et renvoie la chaîne obtenue. |
Fonctions générales
Les fonctions générales sont les suivantes:
| Article | Descriptif |
|---|---|
| Fermer ( Expression ) | Fermez le fichier ou le canal de communication ouvert par une instruction Imprimer ou Printf ou un appel à la fonction Getline avec le même paramètre Expression de valeur chaîne. Si le fichier ou le canal de communication est fermé avec succès, un 0 est renvoyé ; sinon, une valeur différente de zéro est renvoyée. L'instruction Fermer est nécessaire si vous avez l'intention d'écrire un fichier, puis de lire le fichier plus tard dans le même programme. |
| Système (Commande ) | Exécute la commande spécifiée par le paramètre Commande et renvoie son statut de sortie. Equivalent à la sous-routine Système . |
| Expression | Getline [ Variable ] | Létablit un enregistrement d'entrée à partir d'un flux enregistré à partir de la sortie d'une 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 . Le flux est créé si aucun flux n'est actuellement ouvert avec la valeur du paramètre Expression comme nom de commande. Le flux créé est équivalent à un flux créé par un appel à la sous-routine Popen avec le paramètre Commande qui prend la valeur du paramètre Expression et le paramètre Mode défini sur une valeur de R. Chaque appel ultérieur à la fonction Getline lit un autre enregistrement, tant que le flux reste ouvert et que le paramètre Expression a pour résultat 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 définies sur l'enregistrement lu à partir du flux. |
| Getline [ Variable ] < Expression | Létablit l'enregistrement suivant de l'entrée du fichier nommé par le paramètre Expression et définit la variable spécifiée par le paramètre Variable sur la valeur de l'enregistrement. Chaque appel ultérieur à la fonction Getline lit un autre enregistrement, tant que le flux reste ouvert et que le paramètre Expression a pour résultat 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 définies sur l'enregistrement lu à partir du flux. |
| Getline [ Variable ] | Définit la variable spécifiée par le paramètre Variable sur l'enregistrement suivant de l'entrée du fichier d'entrée en cours. Si aucun paramètre Variable n'est spécifié, la variable d'enregistrement $0 est définie sur la valeur de l'enregistrement et les variables spéciales NF, NRet FR sont également définies. |
Note : Toutes les formes de la fonction getline renvoient 1 en cas d'entrée réussie, zéro en cas de 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 sous la forme suivante:
function Name (Parameter, Parameter,...) { Statements }Une fonction peut être appelée n'importe où dans un programme de commande Awk et son utilisation peut précéder sa définition. La portée de la fonction est globale.
Les paramètres de fonction peuvent être des scalaires ou des tableaux. Les noms de paramètre sont locaux à la fonction ; tous les autres noms de variable sont globaux. Le même nom ne doit pas être utilisé pour différentes entités ; par exemple, un nom de paramètre ne doit pas être dupliquée en tant que nom de fonction ou variable spéciale. Les variables ayant une portée globale ne doivent pas partager le nom d'une fonction. Les scalaires et les tableaux ne doivent pas avoir le même nom dans la même portée.
Le nombre de paramètres dans la définition de fonction ne doit pas correspondre au nombre de paramètres utilisés lors de l'appel de la fonction. Les paramètres formels en excès peuvent être utilisés comme variables locales. Les paramètres scalaires supplémentaires sont initialisés avec une valeur de chaîne équivalente à la chaîne vide et une valeur numérique de 0 (zéro) ; les paramètres de tableau supplémentaires sont initialisés en tant que tableaux vides.
Lors de l'appel d'une fonction, aucun espace blanc n'est placé entre le nom de la fonction et la parenthèse ouvraire. Les appels de fonction peuvent être imbriqués et récursifs. En retour d'un appel de fonction imbriqué ou récursif, les valeurs de tous les paramètres de la fonction d'appel sont inchangée, à l'exception des paramètres de tableau transmis par référence. L'instruction Retour peut être utilisée pour renvoyer une valeur.
Dans une définition de fonction, les caractères de nouvelle ligne sont facultatifs avant l'ouverture { (brace) and after the closing } (accolade).
Voici un exemple de définition de fonction:
function average ( g,n)
{
for (i in g)
sum=sum+g[i]
avg=sum/n
return avg
} La moyenne de la fonction est transmise à un tableau,gEt une variable,n, avec le nombre d'éléments dans le tableau. La fonction obtient alors une moyenne et la retourne.
Conditional Statements
La plupart des instructions conditionnelles du langage de programmation de commandes Awk ont la même syntaxe et la même fonction que les instructions conditionnelles dans le langage de programmation C. Toutes les instructions conditionnelles permettent l'utilisation de { } (accolades) pour regrouper des instructions. Une nouvelle ligne facultative peut être utilisée entre la portion d'expression et la partie d'instruction de l'instruction conditionnelle, et les nouvelles lignes ou ; (point-virgule) sont utilisées pour séparer plusieurs instructions dans { } (accolades). Six énoncés conditionnels en langage C sont:
| Article | Descriptif |
|---|---|
| if | Requiert la syntaxe suivante: if ( Expression ) { Instruction } [ else Action ] |
| while | Requiert la syntaxe suivante: while ( Expression ) { Instruction } |
| pour | Requiert la syntaxe suivante: for ( Expression ; Expression ; Expression ) { Instruction } |
| break | Entraîne la fin de la boucle de programme lorsque l'instruction Rupture est utilisée dans une instruction While ou Pour . |
| continue | Permet à la boucle de programme de passer à l'itération suivante lorsque l'instruction Continuer est utilisée dans une instruction While ou Pour . |
Cinq instructions conditionnelles dans le langage de programmation de commandes Awk qui ne suivent pas les règles de langage C sont les suivantes:
| Article | Descriptif |
|---|---|
| For...in | Requiert la syntaxe suivante: for ( Variable dans Array ) { Instruction } L'instruction Pour...Dans définit le paramètre Variable sur chaque valeur d'index de la variable Tableau , un index à la fois et dans aucun ordre particulier, et exécute l'action spécifiée par le paramètre Déclaration avec chaque itération. Voir l'instruction Supprimer pour un exemple d'instruction Pour...Dans . |
| If...in | Requiert la syntaxe suivante: if ( Variable dans Array ) { Instruction } L'instruction Si...Dans recherche l'existence de l'élément Tableau . L'instruction est effectuée si l'élément Tableau est trouvé. |
| Suppression | Requiert la syntaxe suivante: Supprimer Tableau [ Expression ] L'instruction Supprimer supprime à la fois l'élément de tableau spécifié par le paramètre Tableau et l'index spécifié par le paramètre Expression . Par exemple, les instructions: Supprime tous les éléments de lag[]Tableau. |
| Quitter | Requiert la syntaxe suivante: Sortie [ Expression ] L'instruction Sortie appelle d'abord toutes les actions FIN dans l'ordre où elles se produisent, puis met fin à la commande Awk avec un statut d'exit défini par le paramètre Expression . Aucune action FIN ultérieure n'est appelée si l'instruction Sortie se produit dans une action FIN . |
| # | Requiert la syntaxe suivante: # Commentaire L'instruction # place les commentaires. Les commentaires doivent toujours se terminer par une nouvelle ligne, mais peuvent commencer n'importe où sur une ligne. |
| suivant | Arreffectue le traitement de l'enregistrement d'entrée en cours et procède à l'enregistrement d'entrée suivant. |
Instructions de sortie
Deux instructions de sortie dans le langage de programmation de commande Awk sont les suivantes:
| Article | Descriptif |
|---|---|
| Requiert la syntaxe suivante: print [ ExpressionList ] [ Réacheminement ] [ Expression ] L'instruction print écrit la valeur de chaque expression spécifiée par le paramètre ExpressionList dans la sortie standard. Chaque expression est séparée par la valeur actuelle de la variable spéciale FS et chaque enregistrement est arrêté par la valeur en cours de la variable spéciale ORS . La sortie peut être redirigée à l'aide du paramètre Redirection , qui peut spécifier les trois redirections de sortie avec > (supérieur à), > > (double supérieur à) et le | (pipe). Le paramètre Redirection indique comment la sortie est redirigée et le paramètre Expression est un nom de chemin d'accès à un fichier (lorsque le paramètre Redirection est > ou > >) Ou le nom d'une commande (lorsque le paramètre Redirection est un |). |
|
| printf | Requiert la syntaxe suivante: printf Format [, ExpressionList ] [ Réacheminement ] [ Expression ] L'instruction printf écrit dans la sortie standard les expressions spécifiées par le paramètre ExpressionList dans le format spécifié par le paramètre Format . L'instruction Printf fonctionne exactement comme la commande Printf , à l'exception decSpécification de conversion (%c). Les paramètres Redirection et Expression sont identiques à ceux de l'instruction Imprimer . Pour lacSpécification de conversion: si l'argument a une valeur numérique, le caractère dont le codage est la valeur sera la sortie. Si la valeur est égale à zéro ou n'est pas le codage de n'importe quel caractère 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 valeur de chaîne sera output ; si la chaîne ne contient pas de caractères, le comportement n'est pas défini. |
Remarque: Si le paramètre Expression indique un nom de chemin pour le paramètre Redirection , le paramètre Expression doit être placé entre guillemets pour garantir qu'il est traité comme une chaîne.
Variables
Les variables peuvent être des scalaires, des variables de zone, des tableaux ou des variables spéciales. Les noms de variable ne peuvent pas commencer par un chiffre.
Les variables peuvent être utilisées uniquement en les référençant. A l'exception des paramètres de fonction, ils ne sont pas explicitement déclarés. Les variables scalaires et les éléments de tableau non initialisés ont une valeur numérique de 0 (zéro) et une valeur de chaîne de la chaîne null ("").
Les variables prennent des valeurs numériques ou de chaîne en fonction du contexte. Chaque variable peut avoir une valeur numérique, une valeur de chaîne ou les deux. Par exemple :
x = "4" + "8"Affecte la valeur de12à la variablex. Pour les constantes de chaîne, les expressions doivent être incluses dans "" (guillemets).
Il n'existe aucune conversion explicite entre les nombres et les chaînes. Pour forcer une expression à être traitée comme un nombre, ajoutez 0 (zéro) à cette expression. Pour forcer une expression à être traitée comme une chaîne, ajoutez une chaîne nulle ("").
Variables de zone
Les variables de zone sont désignées par un $ (signe dollar) suivi d'un nombre ou d'une expression numérique. La première zone d'un enregistrement est affectée à la variable $1 , la deuxième zone est affectée à la variable $2 , et ainsi de suite. La variable de zone $0 est affectée à l'enregistrement complet. De nouvelles variables de zone peuvent être créées en leur affectant une valeur. L'affectation d'une valeur à une zone inexistante, c'est-à-dire toute zone supérieure à la valeur actuelle de la variable de zone $NF , force la création de toutes les zones intermédiaires (définie sur la chaîne null), augmente la valeur de la variable spéciale NF et force la valeur de 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 F ). Les blancs et les tabulations sont les séparateurs de zone par défaut. Pour modifier le séparateur de zone, utilisez l'indicateur -F ou affectez à la variable spéciale F une valeur différente dans le programme de commande Awk .
Arrays
Les tableaux sont initialement vides et leur taille change dynamiquement. Les tableaux sont représentés par une variable avec des indices en [ ] (crochets). Les sous-scripts, ou identificateurs d'élément, peuvent être des nombres de chaînes, qui fournissent un type de fonction de tableau associatif. Par exemple, le programme:
/red/ { x["red"]++ }
/green/ { y["green"]++ }Incréments d'incréments pour les deuxredCompteur et legreenCompteur.
Les tableaux peuvent être indexés avec plusieurs sous-scripts, similaires à des tableaux multidimensionnels dans certaines langages de programmation. Etant donné que les tableaux de programmation de la commande Awk sont vraiment unidimensionnels, les sous-scripts séparés par des virgules sont convertis en une seule chaîne 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 SOUS-SEP . Par conséquent, les deux opérations d'indexation suivantes sont équivalentes:
x[expr1, expr2,...exprn]ET
x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]Lors de l'utilisation de l'opérateur Dans , une valeur Index multidimensionnelle doit être contenue entre parenthèses. A l'exception de l'opérateur Dans , toute référence à un élément de tableau inexistant crée automatiquement cet élément.
Variables spéciales
Les variables suivantes ont une signification particulière pour la commande Awk :
| Article | Descriptif |
|---|---|
| ARGC | Nombre d'éléments dans le tableau ARGV . Cette valeur peut être modifiée. |
| argv | Le tableau dont chaque membre contient l'une des variables de fichier ou d' affectation, prises dans l'ordre de la ligne de commande et numérotées de 0 (zéro) à ARGC -1. A mesure que chaque fichier d'entrée est terminé, le membre suivant du tableau ARGV fournit le nom du fichier d'entrée suivant, sauf si:
|
| CONVFMT | Format Printf pour convertir des nombres en chaînes (à l'exception des instructions de sortie, où la variable spéciale OFTM est utilisée). La valeur par défaut est "%.6g". |
| ENVIRON | Un tableau représentant l'environnement sous lequel fonctionne la commande Awk . Chaque élément du tableau est de la forme: ENVIRON [ " Nom de la variable d'environnement " ] = EnvironmentVariableValue Les valeurs sont définies lorsque la commande Awk commence l'exécution et que l'environnement est utilisé jusqu'à la fin de l'exécution, quelle que soit la modification de la variable spéciale ENVIRON . |
| nom de fichier | Nom de chemin du fichier d'entrée en cours. Lors de l'exécution d'une action DÉBUT , la valeur de NOM DE FICHIER n'est pas définie. Lors de l'exécution d'une action FIN , la valeur est le nom du dernier fichier d'entrée traité. |
| FR | Numéro de l'enregistrement d'entrée en cours dans le fichier en cours. |
| système de fichiers | Séparateur de zone d'entrée. La valeur par défaut est un blanc. Si le séparateur de zone d'entrée est vide, un nombre quelconque d'espaces définis par l'environnement local peut séparer les zones. La variable spéciale F peut prendre deux valeurs supplémentaires:
|
| NF | Nombre de zones dans l'enregistrement en cours, avec une limite de 99. Dans une action DÉBUT , la variable spéciale NF n'est pas définie, sauf si une fonction Getline sans paramètre Variable a déjà été émise. Dans une action FIN , la variable spéciale NF conserve la valeur qu'elle a eu pour la dernière lecture d'enregistrement, sauf si une fonction ultérieure, redirigée, Getline sans paramètre Variable est émise avant d'entrer l'action FIN . |
| accusé de réception négatif | Numéro de l'enregistrement d'entrée en cours. Dans une action DÉBUT , la valeur de la variable spéciale NR est 0 (zéro). Dans une action FIN , la valeur est le numéro du dernier enregistrement traité. |
| OFTM | Format Printf pour convertir des nombres en chaînes dans des instructions de sortie. La valeur par défaut est "% .6g". |
| FS | Séparateur de zone de sortie (l'espace par défaut est un espace). |
| service ORS | Séparateur d'enregistrement de sortie (la valeur par défaut est un caractère de nouvelle ligne). |
| LONGUEUR | Longueur de la chaîne correspondant à la fonction Correspondance . |
| lecture stable | Séparateur d'enregistrement d'entrée (la valeur par défaut est un caractère de nouvelle ligne). Si la variable spéciale R a la valeur null, les enregistrements sont séparés par des séquences d'une ou plusieurs lignes vides ; les lignes de début ou de fin ne donnent pas lieu à des enregistrements vides au début ou à la fin de l'entrée ; et le caractère de nouvelle ligne est toujours un séparateur de zone, quelle que soit la valeur de la variable spéciale F . |
| RDÉMARRER | Position de départ de la chaîne correspondant à la fonction Correspondance , numérotation à partir de 1. Equivalent à la valeur de retour de la fonction Correspondance . |
| SOUS-SEP | Sépare plusieurs sous-scripts. La valeur par défaut est \031. |
Indicateurs
| Article | Descriptif |
|---|---|
| -f ProgramFile | Obtient des instructions pour la commande awk à partir du fichier spécifié par la variable ProgramFile . Si l'indicateur -f est spécifié plusieurs fois, la concaténation des fichiers, dans l'ordre spécifié, sera utilisée comme ensemble d'instructions. |
| -u | Affiche la sortie en mode non mis en mémoire tampon. Si cette option est utilisée, la commande Awk ne permet pas de mettre la sortie en mémoire tampon. Au lieu de cela, elle affiche la sortie instantanément. Par défaut, la commande Awk affiche la sortie en mode tamponné. |
| -F Ere | Utilise l'expression régulière étendue spécifiée par la variable Ere comme séparateur de zone. Le séparateur de zone 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 se présente sous la forme Nom = Valeur. La partie Nom indique le nom de la variable et peut être n'importe quelle combinaison de traits de soulignement, de chiffres et de caractères alphabétiques, mais elle doit commencer par un caractère alphabétique ou un trait de soulignement. La partie Valeur est également composée de traits de soulignement, de chiffres et de caractères alphabétiques, et est traitée comme si elle était précédée et suivie d'un " (guillemet double, similaire à une valeur de chaîne). Si la partie Valeur est numérique, la valeur numérique est également attribuée à la variable. L'affectation spécifiée par l'indicateur -v se produit avant l'exécution de n'importe quelle partie du programme de la commande Awk , y compris la section DÉBUT . |
| Affectation | Affecte une valeur à une variable pour le langage de programmation de la commande Awk . Il a la même forme et la même fonction que la variable Affectation avec l'indicateur -v , à l'exception du temps traité. Le paramètre Affectation est traité juste avant le fichier d'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 des fichiers d'entrée multiples, les affectations sont traitées juste après les sections DÉBUT (le cas échéant). Si un paramètre Affectation se produit après le dernier fichier, l'affectation est traitée avant les sections FIN (le cas échéant). Si aucun fichier d'entrée n'est spécifié, les affectations sont traitées l'entrée standard est lue. |
| Fichier | Indique le nom du fichier qui contient l'entrée pour le traitement. Si aucune variable Fichier n'est spécifiée ou si un signe - (moins) est spécifié, l'entrée standard est traitée. |
| 'Programme' | Contient les instructions de la commande Awk . Si l'indicateur -f n'est pas spécifié, la variable Programme doit être le premier élément de la ligne de commande. Elle doit être comprise entre crochets'' (apostrophes). |
Statut de sortie
Cette commande renvoie les valeurs de sortie suivantes :
| Article | Descriptif |
|---|---|
| 0 % | L'opération a abouti. |
| >0 | Une erreur s'est produite. |
Vous pouvez modifier l'état de sortie dans le programme à l'aide de l'instruction conditionnelle Sortie [ Expression ] .
Exemples
- Pour afficher les lignes d'un fichier de plus de 72 caractères, entrez:
Cette option sélectionne chaque ligne de lachapter1Qui contient plus de 72 caractères et qui écrit ces lignes dans la sortie standard, car aucun Action n'est spécifié. Un caractère de tabulation est compté comme un octet.awk 'length >72' chapter1 - Pour afficher toutes les lignes entre les mots startetstop,including "start"et "stop",Entrez :
awk '/start/,/stop/' chapter1 - Pour exécuter un programme de commande Awk ,sum2.awk,Qui traite le fichier,chapter1, entrez:
Le programme suivant:sum2.awk, calcule la somme et la moyenne des nombres dans la deuxième colonne du fichier d'entrée,chapter1:awk -f sum2.awk chapter1
La première action ajoute la valeur du second champ de chaque ligne à la variablesum. Toutes les variables sont initialisées à la valeur numérique 0 (zéro) lors de la première référence. Le modèle FIN avant la seconde action entraîne l'exécution de ces actions une fois que le fichier d'entrée a été lu. La variable spéciale NR , utilisée pour calculer la moyenne, est une variable spéciale spécifiant le nombre d'enregistrements lus.{ sum += $2 } END { print "Sum: ", sum; print "Average:", sum/NR; } - Pour imprimer les deux premiers champs dans l'ordre inverse, entrez:
awk '{ print $2, $1 }' chapter1 - Le programme Awk suivant
Imprime les deux premières zones du fichierchapter2Avec des zones d'entrée séparées par des virgules et / ou des blancs et des tabulations, puis additionné la première colonne et imprime la somme et la moyenne:awk -f sum3.awk chapter2BEGIN {FS = ",|[ \t]+"} {print $1, $2} {s += $1} END {print "sum is",s,"average is", s/NR }