GNU/Linux >> Tutoriels Linux >  >> Linux

Un guide pratique pour apprendre awk

De toutes les commandes Linux disponibles (et il y en a beaucoup), les trois plus essentielles semblent être sed , awk , et grep . C'est peut-être le son obscur 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 pendant que sed et grep ont plusieurs normes simples d'une seule ligne, les moins prestigieuses awk reste constamment proéminent pour être particulièrement déroutant.

Vous êtes susceptible d'utiliser sed pour un remplacement rapide de chaîne ou grep pour filtrer un modèle sur une base quotidienne. Vous êtes beaucoup moins susceptible de composer un awk commande. Je me demande souvent pourquoi c'est, et je l'attribue à quelques 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

Plus de ressources Linux

  • Aide-mémoire des commandes Linux
  • Aide-mémoire des commandes Linux avancées
  • Cours en ligne gratuit :Présentation technique de RHEL
  • Aide-mémoire sur le réseau Linux
  • Aide-mémoire SELinux
  • Aide-mémoire sur les commandes courantes de Linux
  • Que sont les conteneurs Linux ?
  • Nos derniers articles Linux

Donc, même si vous vous sentez plus à l'aise avec sed et grep , vous ne pouvez pas utiliser leur plein 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 façon dont j'"apprends" les commandes. Au lieu d'apprendre comment une commande fonctionne, j'apprends souvent une incantation spécifique qui inclut une commande. 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 du haut de ma tête, même si je ne sais pas ce que font les options et que je ne peux pas vraiment mettre le doigt sur la syntaxe.

Et c'est le problème, je crois, auquel beaucoup de gens sont confrontés lorsqu'ils sont confrontés à la puissance et à la flexibilité de awk .

Apprendre awk à utiliser awk

Les bases de awk sont étonnamment simples. Il est souvent noté 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 afin de pouvoir passer à des actions complexes, puis pratiquez, pratiquez, pratiquez.

Comment awk analyse l'entrée

Awk voit l'entrée, essentiellement, comme un tableau. Quand awk scanne 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 NF (nombre de champs) variables intégrées. Par exemple, cela vous donne le nombre de lignes d'un fichier :

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

Cela révèle également quelque chose à propos de awk syntaxe. Que vous écriviez awk comme une ligne ou comme un script autonome, la structure d'un awk l'instruction est :

pattern or keyword { actions }

Dans cet exemple, le mot END est un mot-clé spécial et 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 motif 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 en cours. Par exemple, supposons que vous souhaitiez utiliser awk , comme vous le feriez avec grep , pour trouver le mot Linux dans un fichier de 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 le --field-separator option, qui définit le FS (séparateur de champs) à ce que vous voulez :

$ 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. Ce n'est pas cut , cependant, le séparateur de champs n'a pas besoin d'être limité à un 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 dans 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 qu'elles ne le sont dans les scripts, mais awk définit déjà de nombreuses fonctions pour vous. Ils fonctionnent essentiellement 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 l'alimenter comme vous le souhaitez pour obtenir les résultats.

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

$ 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, le split la fonction prend une entité qui awk vues comme un seul champ et le divise en différentes parties. Il nécessite un champ, une variable à utiliser comme tableau contenant chaque partie du fractionnement et le caractère que vous souhaitez utiliser comme délimiteur.

En utilisant la sortie 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 au split fonction en référençant la variable NF car il contient le nombre de champs (et le dernier champ doit être 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 y a beaucoup plus de fonctions, et il n'y a aucune raison de se limiter à une par bloc de awk code. Vous pouvez construire des pipelines complexes avec awk dans votre terminal, ou vous pouvez écrire awk des scripts pour définir et utiliser vos propres fonctions.

Télécharger le livre électronique

Apprendre awk est principalement une question d'utilisation de awk . Utilisez-le même si cela signifie dupliquer les fonctionnalités que vous avez déjà avec sed ou grep ou cut ou tr ou toute autre commande parfaitement valide. Une fois que vous êtes à l'aise avec cela, vous pouvez écrire des fonctions Bash qui invoquent votre awk personnalisé commandes pour une utilisation simplifiée. 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.


Linux
  1. Un guide pour installer des applications sous Linux

  2. Apprendre à aimer systemd

  3. Guide du débutant sur le pare-feu sous Linux

  4. Un guide du débutant pour rester bouche bée

  5. Mes 8 commandes Linux pratiques préférées

Guide complet de journalisation Linux

16 exemples pratiques de la commande Traceroute sous Linux

20 exemples pratiques de commande Chown sous Linux

12 exemples pratiques d'In Command sous Linux

40 Commande awk pratique et utile sous Linux et BSD

Un guide pratique pour la commande chroot sous Linux