Commande Awk sous Linux avec des exemples

Awk est un langage de script à usage général conçu pour le traitement de texte avancé. Il est principalement utilisé comme outil de reporting et d’analyse.

contrairement à la plupart des autres langages de programmation procéduraux, awk est piloté par les données, ce qui signifie que vous définissez un ensemble d’actions à effectuer sur le texte d’entrée. Il prend les données d’entrée, les transforme et envoie le résultat à la sortie standard.

Cet article couvre l’essentiel du langage de programmation awk., Connaître les bases de awk améliorera considérablement votre capacité à manipuler des fichiers texte sur la ligne de commande.

Comment awk Fonctionne #

Il y a plusieurs implémentations différentes de awk. Nous utiliserons l’implémentation GNU d’awk, qui s’appelle gawk. Sur la plupart des systèmes Linux, l’interpréteurawk n’est qu’un lien symbolique versgawk.

enregistrements et champs #

Awk peut traiter des fichiers de données textuelles et des flux. Les données d’entrée sont divisées en enregistrements et en champs. Awk fonctionne sur un enregistrement à la fois jusqu’à la fin de l’entrée est atteint., Les enregistrements sont séparés par un caractère appelé séparateur d’enregistrement. Le séparateur d’enregistrement par défaut est le caractère de retour à la ligne, ce qui signifie que chaque ligne dans les données de texte est un enregistrement. Un nouveau séparateur d’enregistrement peut être défini à l’aide de la variable RS.

les enregistrements sont constitués de champs séparés par le séparateur de champs. Par défaut, les champs sont séparés par un espace, y compris un ou plusieurs caractères d’onglet, d’espace et de saut de ligne.

les champs de chaque enregistrement sont référencés par le signe dollar ($) suivi du numéro de champ, commençant par 1., Le premier champ est représenté par $1, la seconde avec des $2, et ainsi de suite. Le dernier champ peut également être référencé avec la variable spéciale $NF. L’enregistrement entier peut être référencé avec $0.

Voici une représentation visuelle montrant comment les dossiers de référence et les champs:

tmpfs 788M 1.8M 786M 1% /run/lock /dev/sda1 234G 191G 31G 87% /|-------| |--| |--| |--| |-| |--------| $1 $2 $3 $4 $5 $6 ($NF) --> fields|-----------------------------------------| $0 --> record

Awk programme #

Pour traiter un texte avec awk, vous écrivez un programme qui indique à la commande quoi faire., Le programme se compose d’une série de règles et de fonctions définies par l’utilisateur. Chaque règle contient une paire de motifs et d’actions. Les règles sont séparées par un saut de ligne ou un demi-deux-points (;). En règle générale, un programme awk ressemble à ceci:

pattern { action }pattern { action }...

lorsqueawk traite des données, si le modèle correspond à l’enregistrement, il effectue l’action spécifiée sur cet enregistrement. Lorsque la règle n’a pas de motif, tous les enregistrements (lignes) sont mis en correspondance.

une action awk est placée entre accolades ({}) et se compose d’instructions., Chaque instruction spécifie l’opération à effectuer. Une action peut avoir plusieurs instructions séparées par un saut de ligne ou un demi-deux-points (;). Si la règle n’a aucune action, elle imprime par défaut l’enregistrement entier.

Awk prend en charge différents types d’instructions, y compris les expressions, les conditionnelles, les instructions d’entrée, de sortie, etc. Les instructions awk les plus courantes sont:

  • exit – arrête l’exécution de l’ensemble du programme et se termine.,
  • next – Arrête le traitement de l’enregistrement en cours et passe à l’enregistrement suivant dans les données d’entrée.
  • print – permet d’imprimer des enregistrements, des champs, des variables et du texte personnalisé.
  • printf vous Donne plus de contrôle sur le format de sortie, similaire à C et bash printf .

lors de l’écriture de programmes awk, tout ce qui suit la marque de hachage(#) et jusqu’à la fin de la ligne est considéré comme un commentaire., Les longues lignes peuvent être divisées en plusieurs lignes à l’aide du caractère de continuation, barre oblique inverse (\).

exécution de programmes awk #

Un programme awk peut être exécuté de plusieurs façons. Si le programme est court et simple, il peut être transmis directement à la balise awk interprète sur la ligne de commande:

awk 'program' input-file...

Lors de l’exécution du programme sur la ligne de commande, il doit être entre guillemets simples (''), afin que le shell n’interprète pas le programme.,

Si le programme est vaste et complexe, il est préférable de le mettre dans un fichier et utiliser la balise -f option pour transmettre le dossier à la balise awk commande:

awk -f program-file input-file...

Dans les exemples ci-dessous, nous allons utiliser un fichier nommé « les équipes.txt” qui ressemble à celui ci-dessous:

Bucks Milwaukee 60 22 0.732 Raptors Toronto 58 24 0.707 76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598Pacers Indiana 48 34 0.585

Awk Modèles #

les Modèles dans awk contrôler si l’action associée doit être exécutée ou non.,

Awk prend en charge différents types de modèles, y compris l’expression régulière, l’expression de relation, la plage et les modèles d’expression Spéciaux.

lorsque la règle n’a pas de motif, chaque enregistrement d’entrée est apparié. Voici un exemple d’une règle ne contenant qu’une action:

awk '{ print $3 }' teams.txt

Le programme permettra d’imprimer le troisième champ de chaque enregistrement:

6058514948

les expressions Régulières #

Une expression régulière ou regex est un modèle qui correspond à un ensemble de chaînes de caractères., Awk modèles d’expressions régulières sont entre barres obliques (//):

/regex pattern/ { action }

l’exemple Le plus simple est d’un caractère littéral ou correspondance de chaîne. Par exemple, pour afficher le premier champ de chaque enregistrement qui contient « 0.5”, vous devez exécuter la commande suivante:

awk '/0.5/ { print $1 }' teams.txt
CelticsPacers

Le motif peut être n’importe quel type d’une expression régulière étendue., Voici un exemple qui imprime le premier champ si l’enregistrement commence avec deux ou plus de chiffres:

awk '/^/ { print $1 }' teams.txt
76ers

Relationnelle expressions modèles #

Le relationnel expressions modèles sont généralement utilisés pour faire correspondre le contenu d’un champ ou une variable.

par défaut, les modèles d’expressions régulières sont mis en correspondance avec les enregistrements. Pour faire correspondre une expression régulière à un champ, spécifiez le champ et utilisez l’opérateur de comparaison « contain” (~) contre le modèle.,

Par exemple, pour imprimer le premier champ de chaque enregistrement dont le deuxième champ contient « ia”, vous devez taper:

awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers

pour faire correspondre les champs qui ne contiennent pas un motif donné, utilisez l’opérateur !~:

awk '$2 !~ /ia/ { print $1 }' teams.txt
BucksRaptorsCeltics

Vous pouvez comparer des chaînes ou des nombres pour des relations telles que, supérieur à, inférieur à, égal, etc., La commande suivante imprime le premier champ de tous les enregistrements dont le troisième champ est supérieur à 50:

awk '$3 > 50 { print $1 }' teams.txt
BucksRaptors76ers

modèles de plage #

Les modèles de plage sont constitués de deux modèles séparés par une virgule:

pattern1, pattern2

tous les enregistrements commençant par un enregistrement qui correspond au premier motif jusqu’à ce qu’un enregistrement qui correspond au deuxième motif soit mis en correspondance.,

Voici un exemple qui imprime le premier champ de tous les enregistrements à partir de l’enregistrement, y compris « les Rapaces” jusqu’à l’enregistrement, y compris « Celtics”:

awk '/Raptors/,/Celtics/ { print $1 }' teams.txt

Raptors76ersCeltics

Les modèles peuvent également être relation expressions. La commande ci-dessous affichera tous les enregistrements à partir de celui dont le quatrième champ est égal à 32 jusqu’à celui dont le quatrième champ est égal à 33:

awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598

Les Modèles de Plage ne peuvent pas être combinés avec d’autres expressions de,

special expression patterns #

Awk inclut les motifs spéciaux suivants:

  • BEGIN – utilisé pour effectuer des actions avant le traitement des enregistrements.
  • END – Utilisé pour effectuer des actions après les dossiers sont traités.

le modèleBEGINest généralement utilisé pour définir des variables et le modèleEND pour traiter les données des enregistrements telles que le calcul.

l’exemple suivant affichera « démarrer le traitement. », puis imprimez le troisième champ de chaque enregistrement et enfin « fin du traitement., »:

awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.

Si un programme n’a qu’un BEGIN motif, les actions sont exécutées, et l’entrée n’est pas traitée. Si un programme n’a qu’un modèleEND, l’entrée est traitée avant d’effectuer les actions de règle.

la version Gnu d’awk inclut également deux autres modèles spéciauxBEGINFILEEtENDFILE, qui vous permettent d’effectuer des actions lors du traitement de fichiers.,

en Combinant les modèles #

Awk permet de combiner deux ou plus de motifs à l’aide de la logique ET de l’opérateur (&&) et l’opérateur logique OU (||).,

Voici un exemple qui utilise l’opérateur&& pour imprimer le premier champ de ces enregistrements dont le troisième champ est supérieur à 50 et le quatrième est inférieur à 30:

awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
BucksRaptors

awk a un certain nombre de variables intégrées qui contiennent des informations utiles et vous permet de contrôler la façon dont le programme est traité. Voici quelques-unes des Variables intégrées les plus courantes:

  • NF – le nombre de champs dans l’enregistrement.,
  • NR – Le numéro de l’enregistrement en cours.
  • FILENAME – nom du fichier d’entrée actuellement traité.
  • FS – séparateur de Champ.
  • RS – le séparateur d’Enregistrement.
  • OFS – Sortie de séparateur de champ.
  • ORS – Sortie le séparateur d’enregistrement.,

Voici un exemple montrant comment imprimer le nom du fichier et le nombre de lignes (enregistrements):

awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt

File teams.txt contains 5 lines.

Variables AWK peut être fixé à n’importe quelle ligne dans le programme. Pour définir une variable pour l’ensemble du programme, placez-la dans un modèle BEGIN.

Modification du séparateur de champ et D’enregistrement #

la valeur par défaut du séparateur de champ est un nombre quelconque de caractères d’espace ou de tabulation. Il peut être modifié en définissant dans la variable FS.,

Par exemple, pour définir le séparateur de champ sur . vous utiliseriez:

awk 'BEGIN { FS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0Raptors Toronto 58 24 076ers Philadelphia 51 31 0Celtics Boston 49 33 0Pacers Indiana 48 34 0

Le séparateur de champ peut également être défini sur plusieurs caractères:

awk 'BEGIN { FS = ".." } { print $1 }' teams.txt

lorsque vous exécutez awk one-liners sur la ligne de commande, vous pouvez également utiliser l’option -F pour changer le séparateur de champ:

awk -F "." '{ print $1 }' teams.txt

par défaut, le séparateur d’enregistrement est un caractère de nouvelle ligne et peut être modifié variable.,

Voici un exemple montrant comment modifier le séparateur d’enregistrement de .:

awk 'BEGIN { RS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0732 Raptors Toronto 58 24 0707 76ers Philadelphia 51 31 0622Celtics Boston 49 33 0598Pacers Indiana 48 34 0585

Awk Actions #

Awk actions sont placées entre crochets ({}) et exécutée lorsque le modèle correspond. Une action peut avoir zéro ou plusieurs instructions. Plusieurs instructions sont exécutées dans l’ordre où elles apparaissent et doivent être séparées par un saut de ligne ou un demi-deux-points (;).,

Plusieurs types d’instructions d’action sont pris en charge dans awk:

  • Expressions, telles que l’affectation de variables, les opérateurs arithmétiques, les opérateurs d’incrément et de décrémentation.
  • Contrôle des déclarations, utilisé pour contrôler le flux du programme (if, for, while, switch, et plus)
  • Sortie déclarations, print et printf.
  • instructions composées, pour regrouper d’autres instructions.,
  • instructions D’Entrée, pour contrôler le traitement de l’entrée.
  • instructions de suppression, pour supprimer des éléments de tableau.

l’instructionprint est probablement l’instruction awk la plus utilisée. Il imprime une sortie formatée de texte, d’enregistrements, de champs et de variables.

Lors de l’impression de plusieurs éléments, vous devez les séparer par des virgules., Voici un exemple:

awk '{ print $1, $3, $5 }' teams.txt

L’imprimé éléments sont séparés par des espaces simples:

Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585

Si vous n’utilisez pas de virgules, il n’y aura pas d’espace entre les éléments:

awk '{ print $1 $3 $5 }' teams.txt

Les éléments imprimés sont concaténés:

Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585

Lors de la print est utilisée sans argument, la valeur par défaut est print $0. Le record actuel est imprimé.,

Pour imprimer un texte personnalisé, vous devez citer le texte avec des caractères double-quote:

awk '{ print "The first field:", $1}' teams.txt
The first field: BucksThe first field: RaptorsThe first field: 76ersThe first field: CelticsThe first field: Pacers

Vous pouvez également imprimer des caractères spéciaux tels que le saut de ligne:

awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line

Le printf déclaration vous donne plus de contrôle sur le format de sortie., id= »aa8cfd3cbd »>

printf ne crée pas de nouvelle ligne après chaque enregistrement, nous utilisons donc \n:

 1. Bucks Milwaukee 60 22 0.732 2. Raptors Toronto 58 24 0.707 3. 76ers Philadelphia 51 31 0.622 4. Celtics Boston 49 33 0.598 5. Pacers Indiana 48 34 0.585

la commande suivante calcule la somme des valeurs stockées dans le troisième champ dans chaque ligne:

awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
266

Voici un autre exemple montrant comment utiliser des expressions et des instructions de contrôle pour imprimer les carrés des nombres de 1 à 5:

awk 'BEGIN { i = 1; while (i < 6) { print "Square of", i, "is", i*i; ++i } }'
Square of 1 is 1Square of 2 is 4Square of 3 is 9Square of 4 is 16Square of 5 is 25

Les commandes à une ligne comme celle ci-dessus sont plus difficiles à comprendre et à maintenir., Lorsque vous écrivez des programmes plus longs, vous devez créer un fichier de programme séparé:

prg.awk
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }

Exécutez le programme en passant le nom du fichier à la balise awk interprète:

awk -f prg.awk

Vous pouvez également exécuter un programme awk comme un exécutable en utilisant le shebang la directive et le réglage de la awk interprète:

prg.,awk
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }

Enregistrez le fichier et rendez-Le exécutable :

chmod +x prg.awk

Vous pouvez maintenant exécuter le programme en entrant:

./prg.awk

en utilisant des Variables Shell dans les programmes Awk #

Si vous utilisez la commande awk dans les scripts shell, il est probable que vous deviez passer une variable shell au programme awk. Une option consiste à entourer le programme de guillemets doubles au lieu de guillemets simples et à remplacer la variable dans le programme., Cependant, cette option rendra votre programme awk plus complexe car vous devrez échapper aux variables awk.

la façon recommandée d’utiliser les variables shell dans les programmes awk est d’affecter la variable shell à une variable awk. Voici un exemple:

num=51awk -v n="$num" 'BEGIN {print n}'

Leave a Comment