Recherche de site Web

Un guide pratique pour apprendre l'awk


Maîtrisez mieux la commande awk en téléchargeant notre eBook gratuit.

De toutes les commandes Linux disponibles (et il y en a beaucoup), les trois plus typiques semblent être sed, awk et grep. C'est peut-être le son mystérieux de leurs noms, ou l'étendue de leur utilisation potentielle, ou simplement leur âge, mais quand quelqu'un donne un exemple de commande "Linuxy", c'est généralement l'une de ces trois. Et tandis que sed et grep ont plusieurs standards simples sur une seule ligne, le moins prestigieux awk reste toujours important car il est particulièrement déroutant.

Vous utiliserez probablement sed pour un remplacement rapide de chaîne ou grep pour filtrer un modèle quotidiennement. Vous êtes beaucoup moins susceptible de composer une commande awk. Je me demande souvent pourquoi, et j'attribue cela à plusieurs choses. Tout d'abord, beaucoup d'entre nous utilisent à peine sed et grep pour autre chose que quelques variations sur ces deux commandes :

$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt

Ainsi, même si vous vous sentez plus à l'aise avec sed et grep, vous n'utiliserez peut-être pas tout leur potentiel. Bien sûr, il n'y a aucune obligation d'en savoir plus sur sed ou grep, mais je m'interroge parfois sur la manière dont j'"apprends" les commandes. Au lieu d'apprendre comment fonctionne un ordre, j'apprends souvent une incantation spécifique qui inclut un ordre. De ce fait, je ressens souvent une fausse familiarité avec la commande. Je pense que je connais une commande parce que je peux nommer trois ou quatre options de mémoire, même si je ne sais pas ce que font les options et que je n'arrive pas à mettre le doigt sur la syntaxe.

Et c'est le problème, je crois, auquel de nombreuses personnes sont confrontées lorsqu'elles sont confrontées à la puissance et à la flexibilité de awk.

Apprendre awk à utiliser awk

Les bases de awk sont étonnamment simples. On dit souvent que awk est un langage de programmation, et bien qu'il soit relativement basique, c'est vrai. Cela signifie que vous pouvez apprendre awk de la même manière que vous apprenez un nouveau langage de codage : apprenez sa syntaxe à l'aide de quelques commandes de base, apprenez son vocabulaire pour pouvoir passer à des actions complexes, puis pratiquez, pratiquez, pratiquez. .

Comment awk analyse l'entrée

Awk considère l'entrée essentiellement comme un tableau. Lorsque awk analyse un fichier texte, il traite chaque ligne, individuellement et successivement, comme un enregistrement. Chaque enregistrement est divisé en champs. Bien sûr, awk doit garder une trace de ces informations, et vous pouvez voir ces données en utilisant le NR (nombre d'enregistrements) et le NF (nombre de champs) variables intégrées. Par exemple, ceci vous donne le nombre de lignes d'un fichier :

$ awk 'END { print NR;}' example.txt
36

Cela révèle également quelque chose sur la syntaxe awk. Que vous écriviez awk sous forme de monoligne ou de script autonome, la structure d'une instruction awk est :

pattern or keyword { actions }

Dans cet exemple, le mot END est un mot-clé spécial réservé plutôt qu'un modèle. Un mot-clé similaire est BEGIN. Avec ces deux mots-clés, awk exécute simplement l'action entre accolades au début ou à la fin de l'analyse des données.

Vous pouvez utiliser un modèle comme filtre ou qualificatif afin que awk n'exécute une action donnée que lorsqu'il est capable de faire correspondre votre modèle à l'enregistrement actuel. Par exemple, supposons que vous souhaitiez utiliser awk, tout comme vous le feriez avec grep, pour rechercher le mot Linux dans un fichier texte :

$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)

Pour awk, chaque ligne du fichier est un enregistrement et chaque mot d'un enregistrement est un champ. Par défaut, les champs sont séparés par un espace. Vous pouvez changer cela avec l'option --field-separator, qui définit la variable FS (séparateur de champ) comme vous le souhaitez :

$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt 
 CentOS Linux (10.1.1.8)
 CentOS Linux (10.1.1.9)
 Red Hat Enterprise Linux (RHEL) (10.1.1.11)
 Elementary Linux (10.1.2.4)
 Elementary Linux (10.1.2.5)
 Elementary Linux (10.1.2.6)

Dans cet exemple, il y a un espace vide avant chaque liste car il y a un espace vide après chaque deux-points (:) dans le texte source. Cependant, ce n'est pas cut, donc le séparateur de champ ne doit pas nécessairement être limité à un seul caractère :

$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt 
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)

Fonctions en awk

Vous pouvez créer vos propres fonctions dans awk en utilisant cette syntaxe :

name(parameters) { actions }

Les fonctions sont importantes car elles vous permettent d'écrire du code une seule fois et de le réutiliser tout au long de votre travail. Lors de la construction de one-liners, les fonctions personnalisées sont un peu moins utiles que dans les scripts, mais awk définit déjà de nombreuses fonctions pour vous. Ils fonctionnent fondamentalement de la même manière que n'importe quelle fonction dans n'importe quel autre langage ou feuille de calcul : vous apprenez l'ordre dans lequel la fonction a besoin d'informations de votre part, et vous pouvez lui donner ce que vous voulez pour obtenir les résultats.

Il existe des fonctions pour effectuer des opérations mathématiques et le traitement des chaînes. Les calculs mathématiques sont souvent assez simples. Vous fournissez un nombre, et il le calcule :

$ awk 'BEGIN { print sqrt(1764); }'
42

Les fonctions de chaîne peuvent être plus complexes mais sont bien documentées dans le manuel GNU awk. Par exemple, la fonction split prend une entité que awk considère comme un seul champ et la divise en différentes parties. Cela nécessite un champ, une variable à utiliser comme tableau contenant chaque partie de la division et le caractère que vous souhaitez utiliser comme délimiteur.

En utilisant le résultat des exemples précédents, je sais qu'il y a une adresse IP à la toute fin de chaque enregistrement. Dans ce cas, je peux envoyer uniquement le dernier champ d'un enregistrement à la fonction split en référençant la variable NF car elle contient le nombre de champs (et le champ final doit soit le nombre le plus élevé) :

$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2

Il existe beaucoup plus de fonctions, et il n'y a aucune raison de vous limiter à une par bloc de code awk. Vous pouvez construire des pipelines complexes avec awk dans votre terminal, ou vous pouvez écrire des scripts awk pour définir et utiliser vos propres fonctions.

Téléchargez le livre électronique

Apprendre awk consiste principalement à utiliser awk. Utilisez-le même si cela signifie dupliquer des fonctionnalités que vous possédez déjà avec sed ou grep ou cut ou tr ou tout autre commandes parfaitement valides. Une fois que vous serez à l'aise avec cela, vous pourrez écrire des fonctions Bash qui appelleront vos commandes awk personnalisées pour une utilisation plus facile. Et éventuellement, vous pourrez écrire des scripts pour analyser des ensembles de données complexes.

Téléchargez notre eBook pour apprendre tout ce que vous devez savoir sur awk, et commencez à l'utiliser dès aujourd'hui.

Articles connexes: