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.