Comment filtrer du texte ou une chaîne en utilisant Awk et les expressions régulières – Partie 1

Lorsque nous exécutons certaines commandes sous Linux pour lire ou modifier du texte à partir d’une chaîne ou d’un fichier, nous essayons souvent de filtrer la sortie pour une section spécifique d’intérêt. C’est là que l’utilisation des expressions régulières est utile.

Qu’est-ce que les expressions régulières?

A regular expression can be defined as strings that represent several sequences of characters. One of the most important things about regular expressions is that they allow you to filter the output of a command or file, edit a section of a text or configuration file, and so on.

Caractéristiques des expressions régulières

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

  • Caractères ordinaires tels que l’espace, le tiret bas (_), A-Z, a-z, 0-9.
  • Méta-caractères qui sont étendus en caractères ordinaires, comprennent :
    • (.) il correspond à n’importe quel caractère unique sauf un retour à la ligne.
    • (*) il correspond à zéro ou plusieurs occurrences du caractère immédiatement précédent.
    • [ caractère(s) ] il correspond à l’un des caractères spécifiés dans caractère(s), on peut également utiliser un tiret (-) pour signifier une plage de caractères comme [a-f], [1-5], et ainsi de suite.
    • ^ il correspond au début d’une ligne dans un fichier.
    • $ correspond à la fin de la ligne dans un fichier.
    • \ c’est un caractère d’échappement.

Pour filtrer du 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 pour le cadre de ce guide sur l’utilisation de awk, nous le couvrirons comme un simple outil de filtrage en 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_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. Cela est répété sur toutes les lignes du fichier.

Le 'script' est sous la forme '/motif/ action' où le motif est une expression régulière et l’action est ce que awk fera lorsqu’il trouve le motif donné dans une ligne.

Comment utiliser l’outil de filtrage Awk sous Linux

Dans les exemples suivants, nous nous concentrerons sur les métacaractères que nous avons discutés ci-dessus dans les fonctionnalités d’awk.

Imprimer toutes les lignes du fichier en utilisant Awk

L’exemple ci-dessous imprime toutes les lignes du fichier /etc/hosts car aucun motif n’est donné.

awk '//{print}'/etc/hosts
Awk Prints All Lines in a File

Utiliser des motifs Awk : Correspondance de lignes avec ‘localhost’ dans le fichier

Dans l’exemple ci-dessous, un motif localhost est donné, donc awk correspondra à la ligne contenant localhost dans le fichier /etc/hosts.

awk '/localhost/{print}' /etc/hosts 
Awk Print Given Matching Line in a File

Utilisation d’Awk avec le Joker (.) dans un Motif

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

C’est-à-dire * l un seul caractère quelconque c *.

awk '/l.c/{print}' /etc/hosts
Use Awk to Print Matching Strings in a File

Utilisation d’Awk avec le Caractère (*) dans un Motif

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

awk '/l*c/{print}' /etc/localhost
Use Awk to Match Strings in File

Vous remarquerez également que (*) essaie d’obtenir la correspondance la plus longue possible qu’il peut détecter.

Jetons un coup d’œil à un cas qui le démontre, prenons l’expression régulière t*t qui signifie correspondre aux 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 utilisez le motif /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 de joker /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

Utilisation d’Awk avec un ensemble [ caractère(s) ]

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

awk '/[al1]/{print}' /etc/hosts
Use-Awk to Print Matching Character in File

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

# awk '/[Kk]T/{print}' /etc/hosts 
Use Awk to Print Matched String in File

Spécifier des caractères dans une plage

Comprendre les caractères avec awk:

  • [0-9] signifie un seul chiffre
  • [a-z] signifie faire correspondre une seule lettre minuscule
  • [A-Z] signifie faire correspondre une seule lettre majuscule
  • [a-zA-Z] signifie faire correspondre une seule lettre
  • [a-zA-Z 0-9] signifie faire correspondre une seule lettre ou un chiffre

Regardons un exemple ci-dessous :

awk '/[0-9]/{print}' /etc/hosts 
Use Awk To Print Matching Numbers in File

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

Utiliser Awk avec le métacaractère (^)

Cela fait correspondre 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
Use Awk to Print All Matching Lines with Pattern

Utiliser Awk avec le métacaractère ($)

Cela fait correspondre 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
Use Awk to Print Given Pattern String

Utiliser Awk avec le caractère d’échappement (\)

Cela vous permet de prendre le caractère qui suit comme un littéral, c’est-à-dire de le considérer tel quel.

Dans l’exemple ci-dessous, le premier commandement imprime toutes les lignes du fichier, et le deuxième commandement n’imprime rien car je veux faire correspondre une ligne qui contient $25.00, mais aucun caractère d’échappement n’est utilisé.

Le troisième commandement est correct car un caractère d’échappement a été utilisé pour lire $ tel qu’il est.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt
Use Awk with Escape Character
Résumé

Ce n’est pas tout avec l’outil de filtrage en ligne de commande awk, les exemples ci-dessus sont les opérations de base de awk. Dans les prochaines parties, nous aborderons comment utiliser les fonctionnalités complexes de awk.

Merci d’avoir lu et pour toute addition ou clarification, veuillez laisser un commentaire dans la section des commentaires.

Source:
https://www.tecmint.com/use-linux-awk-command-to-filter-text-string-in-files/