GNU/Linux >> Tutoriels Linux >  >> Linux

Expressions régulières dans Grep (Regex)

grep est l'une des commandes les plus utiles et les plus puissantes de Linux pour le traitement de texte. grep recherche dans un ou plusieurs fichiers d'entrée les lignes qui correspondent à une expression régulière et écrit chaque ligne correspondante dans la sortie standard.

Dans cet article, nous allons explorer les bases de l'utilisation des expressions régulières dans la version GNU de grep , qui est disponible par défaut dans la plupart des systèmes d'exploitation Linux.

Expression régulière Grep #

Une expression régulière ou regex est un modèle qui correspond à un ensemble de chaînes. Un modèle se compose d'opérateurs, construit des caractères littéraux et des méta-caractères, qui ont une signification particulière. GNU grep prend en charge trois syntaxes d'expression régulière, de base, étendue et compatible Perl.

Dans sa forme la plus simple, lorsqu'aucun type d'expression régulière n'est donné, grep interpréter les modèles de recherche comme des expressions régulières de base. Pour interpréter le modèle comme une expression régulière étendue, utilisez le -E ( ou --extended-regexp ).

Dans l'implémentation GNU de grep il n'y a pas de différence fonctionnelle entre les syntaxes d'expression régulière de base et étendue. La seule différence est que dans les expressions régulières de base, les méta-caractères ? , + , { , | , ( , et ) sont interprétés comme des caractères littéraux. Pour conserver les significations spéciales des méta-caractères lors de l'utilisation d'expressions régulières de base, les caractères doivent être échappés avec une barre oblique inverse (\ ). Nous expliquerons la signification de ces méta-caractères et d'autres plus tard.

En règle générale, vous devez toujours placer l'expression régulière entre guillemets simples pour éviter l'interprétation et l'expansion des méta-caractères par le shell.

Correspondances littérales #

L'utilisation la plus élémentaire de grep La commande consiste à rechercher un caractère littéral ou une série de caractères dans un fichier. Par exemple, pour afficher toutes les lignes contenant la chaîne "bash" dans le /etc/passwd fichier, vous exécuterez la commande suivante :

grep bash /etc/passwd

Le résultat devrait ressembler à ceci :

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Dans cet exemple, la chaîne "bash" est une expression régulière de base composée de quatre caractères littéraux. Cela indique à grep pour rechercher une chaîne contenant un "b" immédiatement suivi de "a", "s" et "h".

Par défaut, le grep la commande est sensible à la casse. Cela signifie que les caractères majuscules et minuscules sont traités comme distincts.

Pour ignorer la casse lors de la recherche, utilisez le -i option (ou --ignore-case ).

Il est important de noter que grep recherche le modèle de recherche sous la forme d'une chaîne, pas d'un mot. Donc, si vous cherchiez "gnu", grep imprimera également les lignes où "gnu" est incorporé dans des mots plus grands, tels que "cygnus" ou "magnum".

Si la chaîne de recherche comprend des espaces, vous devez la placer entre guillemets simples ou doubles :

grep "Gnome Display Manager" /etc/passwd

Numéro d'ancrage

Les ancres sont des méta-caractères qui vous permettent de spécifier où dans la ligne la correspondance doit être trouvée.

Le ^ (caret) correspond à la chaîne vide au début d'une ligne. Dans l'exemple suivant, la chaîne "linux" ne correspondra que si elle apparaît au tout début d'une ligne.

grep '^linux' file.txt

Le $ (dollar) correspond à la chaîne vide au début d'une ligne. Pour trouver une ligne qui se termine par la chaîne "linux", vous utiliserez :

grep 'linux$' file.txt

Vous pouvez également construire une expression régulière en utilisant les deux ancres. Par exemple, pour rechercher des lignes contenant uniquement "linux", exécutez :

grep '^linux$' file.txt

Un autre exemple utile est le ^$ modèle qui correspond à toutes les lignes vides.

Caractère unique correspondant #

Le . Le symbole (point) est un méta-caractère qui correspond à n'importe quel caractère unique. Par exemple, pour faire correspondre tout ce qui commence par "kan", puis comporte deux caractères et se termine par la chaîne "roo", vous utiliserez le modèle suivant :

grep 'kan..roo' file.txt

Expressions entre crochets #

Les expressions entre crochets permettent de faire correspondre un groupe de caractères en les mettant entre crochets [] . Par exemple, trouvez les lignes qui contiennent "accepter" ou "accent", vous pouvez utiliser l'expression suivante :

grep 'acce[np]t' file.txt

Si le premier caractère à l'intérieur des crochets est le caret ^ , alors il correspond à n'importe quel caractère unique qui n'est pas entre crochets. Le modèle suivant correspondra à n'importe quelle combinaison de chaînes commençant par "co" suivi de n'importe quelle lettre sauf "l" suivi de "la", comme "coca", "cobalt" et ainsi de suite, mais ne correspondra pas aux lignes contenant "cola ” :

grep 'co[^l]a' file.txt

Au lieu de placer les caractères un par un, vous pouvez spécifier une plage de caractères à l'intérieur des crochets. Une expression de plage est construite en spécifiant les premier et dernier caractères de la plage séparés par un trait d'union. Par exemple, [a-a] est équivalent à [abcde] et [1-3] est équivalent à [123] .

L'expression suivante correspond à chaque ligne commençant par une majuscule :

grep '^[A-Z]' file.txt

grep prend également en charge les classes de caractères prédéfinies entre crochets. Le tableau suivant présente certaines des classes de caractères les plus courantes :

Quantificateur Classes de personnages
[:alnum:] Caractères alphanumériques.
[:alpha:] Caractères alphabétiques.
[:blank:] Espace et tabulation.
[:digit:] Chiffres.
[:lower:] Lettres minuscules.
[:upper:] Majuscules.

Pour une liste complète de toutes les classes de personnages, consultez le manuel de Grep.

Quantificateurs #

Les quantificateurs vous permettent de spécifier le nombre d'occurrences d'éléments qui doivent être présents pour qu'une correspondance se produise. Le tableau suivant montre les quantificateurs pris en charge par GNU grep :

Quantificateur Description
* Mettre en correspondance l'élément précédent zéro ou plusieurs fois.
? Mettre en correspondance l'élément précédent zéro ou une fois.
+ Faites correspondre l'élément précédent une ou plusieurs fois.
{n} Reconnaître exactement l'élément précédent n fois.
{n,} Reconnaître l'élément précédent au moins n fois.
{,m} Reconnaître l'élément précédent au plus m fois.
{n,m} Mettre en correspondance l'élément précédent de n à m fois.

Le * (astérisque) correspond à l'élément précédent zéro ou plusieurs fois. Les éléments suivants correspondront à "right", "sright" "ssright" et ainsi de suite :

grep 's*right'

Vous trouverez ci-dessous un modèle plus avancé qui correspond à toutes les lignes commençant par une majuscule et se terminant par un point ou une virgule. Le .* regex correspond à n'importe quel nombre de caractères :

grep -E '^[A-Z].*[.,]$' file.txt

Le ? (point d'interrogation) rend l'élément précédent facultatif et il ne peut correspondre qu'une seule fois. Ce qui suit correspondra à la fois à "lumineux" et à "droit". Le ? caractère est échappé avec une barre oblique inverse car nous utilisons des expressions régulières de base :

grep 'b\?right' file.txt

Voici la même expression régulière utilisant une expression régulière étendue :

grep -E 'b?right' file.txt

Le + (plus) correspond à l'élément précédent une ou plusieurs fois. Les éléments suivants correspondront à "sright" et "ssright", mais pas à "right":

grep -E 's+right' file.txt

Les accolades {} vous permet de spécifier le nombre exact, une limite supérieure ou inférieure ou une plage d'occurrences qui doivent se produire pour qu'une correspondance se produise.

Ce qui suit correspond à tous les entiers comportant entre 3 et 9 chiffres :

grep -E '[[:digit:]]{3,9}' file.txt

Alternance #

Le terme alternance est un simple « OU ». L'opérateur d'alternance | (pipe) vous permet de spécifier différentes correspondances possibles qui peuvent être des chaînes littérales ou des ensembles d'expressions. Cet opérateur a la priorité la plus faible de tous les opérateurs d'expression régulière.

Dans l'exemple ci-dessous, nous recherchons toutes les occurrences des mots fatal , error , et critical dans le fichier Nginx logerror :

grep 'fatal\|error\|critical' /var/log/nginx/error.log

Si vous utilisez l'expression régulière étendue, alors l'opérateur | ne doit pas être échappé, comme indiqué ci-dessous :

grep -E 'fatal|error|critical' /var/log/nginx/error.log

N° de groupe

Le regroupement est une fonctionnalité des expressions régulières qui vous permet de regrouper des modèles et de les référencer comme un seul élément. Les groupes sont créés à l'aide de parenthèses () .

Lors de l'utilisation d'expressions régulières de base, la parenthèse doit être échappée avec une barre oblique inverse (\ ).

L'exemple suivant correspond à la fois à "intrépide" et à "moins". Le ? le quantificateur fait la (fear) groupe facultatif :

grep -E '(fear)?less' file.txt

Expressions spéciales de barre oblique inverse #

GNU grep comprend plusieurs méta-caractères composés d'une barre oblique inverse suivie d'un caractère normal. Le tableau suivant présente certaines des expressions antislash spéciales les plus courantes :

Expression Description
\b Mettre en correspondance une limite de mot.
\< Reconnaître une chaîne vide au début d'un mot.
\> Reconnaître une chaîne vide à la fin d'un mot.
\w Reconnaître un mot.
\s Faites correspondre un espace.

Le modèle suivant correspondra à des mots séparés "abject" et "object". Il ne correspondra pas aux mots s'il est intégré dans des mots plus longs :

grep '\b[ao]bject\b' file.txt

Conclusion #

Les expressions régulières sont utilisées dans les éditeurs de texte, les langages de programmation et les outils de ligne de commande tels que grep , sed , et awk . Savoir comment construire des expressions régulières peut être très utile lors de la recherche de fichiers texte, de l'écriture de scripts ou du filtrage de la sortie de commande.

Si vous avez des questions ou des commentaires, n'hésitez pas à laisser un commentaire.


Linux
  1. Premiers pas avec les expressions régulières :un exemple

  2. Présentation des expressions régulières

  3. Besoin d'échapper aux caractères Regex dans Sed pour être interprétés comme des caractères Regex ?

  4. Bash :Expressions régulières en substitution ?

  5. Regex (grep) pour la recherche multi-lignes nécessaire

Initiation aux expressions régulières

Grep Regex :un guide complet

Comment Grep pour plusieurs chaînes et modèles

10 exemples pratiques de regex avec grep

Pourquoi `\d` ne fonctionne-t-il pas dans les expressions régulières de sed ?

Que signifie \b dans un modèle grep ?