Recherche de site Web

Comment utiliser Awk et les expressions régulières pour filtrer du texte ou une chaîne dans des fichiers


Lorsque nous exécutons certaines commandes sous Unix/Linux pour lire ou modifier le texte d'une chaîne ou d'un fichier, nous essayons la plupart du temps de filtrer la sortie sur une section d'intérêt donnée. C’est là que l’utilisation d’expressions régulières s’avère utile.

Lire aussi : 10 opérateurs de chaînage Linux utiles avec des exemples pratiques

Que sont les expressions régulières ?

Une expression régulière peut être définie comme une chaîne représentant plusieurs séquences de caractères. L'un des aspects les plus importants des expressions régulières est qu'elles vous permettent de filtrer la sortie d'une commande ou d'un fichier, de modifier une section d'un texte ou d'un fichier de configuration, etc.

Caractéristiques de l'expression régulière

Les expressions régulières sont constituées de :

  1. Caractères ordinaires tels que l'espace, le trait de soulignement (_), A-Z, a-z, 0-9.
  2. Les méta-caractères étendus aux caractères ordinaires comprennent :

    1. (.) il correspond à n'importe quel caractère à l'exception d'une nouvelle ligne.
    2. (*) il correspond à zéro ou plusieurs existences du caractère immédiat qui le précède.
    3. [ caractère(s) ] il correspond à l'un des caractères spécifiés dans caractère(s), on peut également utiliser un trait d'union (-) pour désigner une plage de caractères telle que comme [a-f], [1-5], et ainsi de suite.
    4. ^ il correspond au début d'une ligne dans un fichier.
    5. $ correspond à la fin de la ligne d'un fichier.
    6. \ c'est un caractère d'échappement.

Afin de filtrer le texte, il faut utiliser un outil de filtrage de texte tel que awk. Vous pouvez considérer awk comme un langage de programmation à part entière. Mais dans le cadre de ce guide sur l'utilisation de awk, nous le couvrirons comme un simple outil de filtrage de ligne de commande.

La syntaxe générale de awk est :

awk 'script' filename

'script' est un ensemble de commandes comprises par awk et exécutées sur le fichier, nom de fichier.

Il fonctionne en lisant une ligne donnée dans le fichier, en faisant une copie de la ligne puis en exécutant le script sur la ligne. Ceci est répété sur toutes les lignes du fichier.

Le 'script' est sous la forme '/pattern/ action'pattern est une expression régulière et l'action c'est ce que fera awk lorsqu'il trouvera le modèle donné dans une ligne.

Comment utiliser l'outil de filtrage Awk sous Linux

Dans les exemples suivants, nous nous concentrerons sur les méta-caractères dont nous avons discuté ci-dessus sous les fonctionnalités de awk.

Un exemple simple d'utilisation de awk :

L'exemple ci-dessous imprime toutes les lignes du fichier /etc/hosts puisqu'aucun modèle n'est donné.

awk '//{print}'/etc/hosts

Utilisez Awk avec Pattern :

Dans l'exemple ci-dessous, un modèle localhost a été donné, donc awk correspondra à la ligne ayant localhost dans le fichier /etc/hosts.

awk '/localhost/{print}' /etc/hosts 

Utilisation d'Awk avec le caractère générique (.) dans un modèle

Le (.) correspondra aux chaînes contenant loc, localhost, localnet dans l'exemple ci-dessous.

Soit *l some_single_character c*.

awk '/l.c/{print}' /etc/hosts

Utilisation d'Awk avec le caractère (*) dans un modèle

Il correspondra aux chaînes contenant localhost, localnet, lines, capable, comme dans l'exemple ci-dessous :

awk '/l*c/{print}' /etc/localhost

Vous réaliserez également que (*) essaie de vous obtenir la correspondance la plus longue possible qu'il puisse détecter.

Regardons un cas qui démontre cela, prenons l'expression régulière t*t qui signifie faire correspondre les chaînes qui commencent par la lettre t et se terminent par t dans la ligne ci-dessous :

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

Vous obtiendrez les possibilités suivantes lorsque vous utiliserez le modèle /t*t/ :

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

Et (*) dans le caractère générique /t*t/ permet à awk de choisir la dernière option :

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

Utiliser Awk avec set [caractère(s)]

Prenez par exemple l'ensemble [al1], ici awk correspondra à toutes les chaînes contenant le caractère a ou l ou 1 dans une ligne du fichier /etc/hosts.

awk '/[al1]/{print}' /etc/hosts

L'exemple suivant correspond aux chaînes commençant par K ou k suivi de T :

awk '/[Kk]T/{print}' /etc/hosts 

Spécification de caractères dans une plage

Comprendre les caractères avec awk :

  1. [0-9] signifie un seul numéro
  2. [a-z] signifie correspondre à une seule lettre minuscule
  3. [A-Z] signifie correspondre à une seule lettre majuscule
  4. [a-zA-Z] signifie correspondre à une seule lettre
  5. [a-zA-Z 0-9] signifie correspondre à une seule lettre ou un seul chiffre

Regardons un exemple ci-dessous :

awk '/[0-9]/{print}' /etc/hosts 

Toutes les lignes du fichier /etc/hosts contiennent au moins un seul chiffre [0-9] dans l'exemple ci-dessus.

Utilisez Awk avec (^) méta-caractère

Il correspond à toutes les lignes qui commencent par le motif fourni comme dans l'exemple ci-dessous :

awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts

Utilisez Awk avec le méta-caractère ($)

Il correspond à toutes les lignes qui se terminent par le motif fourni :

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts

Utilisez Awk avec (\) le caractère d'échappement

Il permet de prendre le caractère qui le suit au pied de la lettre, c'est-à-dire de le considérer tel qu'il est.

Dans l'exemple ci-dessous, la première commande imprime toutes les lignes du fichier, la deuxième commande n'imprime rien car je souhaite faire correspondre une ligne contenant 25,00 $, mais aucun caractère d'échappement n'est utilisé.

La troisième commande est correcte puisqu'un caractère d'échappement a été utilisé pour lire $ tel quel.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt

Résumé

Ce n'est pas tout avec l'outil de filtrage de ligne de commande awk, les exemples ci-dessus présentent les opérations de base d'awk. Dans les prochaines parties, nous verrons comment utiliser les fonctionnalités complexes d'awk. Merci d'avoir lu et pour tout ajout ou clarification, postez un commentaire dans la section commentaires.