Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Expressions régulières
  3. grep, la commande de recherche de lignes
Extrait - Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition)
Extraits du livre
Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition) Revenir à la page d'achat du livre

grep, la commande de recherche de lignes

Description 

grep est une commande permettant de rechercher des chaînes de caractères dans des fichiers texte. Elle traite indifféremment des fichiers dont le nom lui est passé en argument, ou des données qu’elle lit sur l’entrée standard (stdin).

Cette commande a été écrite très rapidement par Ken Thompson à partir de fragments de code source de ed. Son nom provient de la commande de recherche globale d’expressions régulières de ed :

g/re/p 

qui signifie comme nous l’avons vu précédemment dans le chapitre consacré à ed : rechercher toutes les lignes du fichier (g) contenant une chaîne correspondant à l’expression régulière re (re : Regular Expression), puis les afficher (p).

grep a tout d’abord été une commande privée de Ken Thompson, avant qu’il ne se décide à la placer dans un répertoire d’utilitaires du système (/bin) avant la sortie d’UNIX v4 (version 4 d’UNIX interne aux laboratoires Bell).

Elle fait maintenant partie des commandes indispensables des utilisateurs d’UNIX (et dérivés d’UNIX) par qui elle est souvent utilisée comme outil de filtrage des résultats d’autres commandes.

Il en existe deux autres variantes : egrep et fgrep. egrep est capable de traiter...

Principe de fonctionnement 

1. Généralités 

La commande grep (ou sa variante egrep) recherche dans des fichiers ou dans l’entrée standard des lignes contenant des chaînes de caractères spécifiées par des chaînes fixes ou des expressions régulières.

L’expression à rechercher est passée en argument à la commande, ainsi qu’une éventuelle liste de fichiers à examiner.

Les expressions reconnues par grep sont des expressions régulières basiques, tandis que celles reconnues par egrep sont des expressions régulières étendues.

Chaque ligne dont une sous-chaîne correspond à l’expression régulière sera affichée (sauf demande contraire) sur la sortie standard.

Les nombreuses options disponibles permettent de modifier ce comportement, et de demander de n’afficher aucun résultat, dans le cas où l’on souhaite uniquement utiliser le code de retour pour savoir si les données contiennent ou non une chaîne correspondant à l’expression régulière spécifiée. Il est également possible, dans le cas de la commande provenant de la FSF (Free Software Foundation), d’afficher le contexte de la ligne correspondant à l’expression régulière, en affichant des lignes...

Les expressions basiques 

1. Généralités 

Les expressions régulières basiques sont celles qui sont reconnues par la commande grep. Consultez le chapitre Synthèse des types d’expression en fin d’ouvrage pour un résumé des caractéristiques.

2. Utilisation du caractère ^

Le caractère ^ en début d’expression spécifie un début de ligne. À l’aide de ce caractère, il est possible de rechercher une chaîne en début de ligne. Les chaînes recherchées peuvent être exprimées sous forme de chaînes de caractères ou d’expressions régulières.

Si l’on recherche une chaîne commençant par le caractère ^, il faudra enlever au caractère ^ sa signification générique en le faisant précéder d’un antislash.

3. Utilisation du caractère $

Le caractère $ en fin d’expression spécifie une fin de ligne. À l’aide de ce caractère, il est possible de rechercher une chaîne en fin de ligne. Les chaînes recherchées peuvent être exprimées sous forme de chaînes de caractères fixes ou d’expressions régulières.

Si l’on recherche une chaîne se terminant par le caractère $, il faudra enlever au caractère $ sa signification générique en le faisant précéder d’un antislash.

4. Utilisation du caractère...

Les expressions étendues 

1. Généralités 

Les expressions régulières étendues sont celles qui sont reconnues par egrep, ou par grep lorsqu’on l’utilise avec l’option -E (ou --extended-regexp).

Elles permettent, entre autres, de grouper des expressions grâce aux parenthèses, de déclarer des expressions optionnelles, et d’utiliser des OU logiques.

Dans les sections qui suivent, seules les spécificités des expressions régulières étendues par rapport aux expressions régulières basiques seront présentées.

Les métacaractères des expressions régulières basiques font partie des expressions régulières étendues.

Consultez le chapitre Synthèse des types d’expression en fin d’ouvrage pour un résumé des caractéristiques.

2. Utilisation des caractères ( ) 

Les parenthèses servent à grouper des expressions.

3. Utilisation du caractère |

Le caractère | est équivalent à un OU logique (booléen). Il sert à exprimer qu’une chaîne peut correspondre à une expression ou à une autre.

4. Utilisation du caractère ?

Le caractère ? dans une expression sert à indiquer que le caractère ou l’expression qui le précède...

Exercices 

1. Exercice 1 

Comment rechercher dans le fichier /etc/passwd tous les utilisateurs dont le nom contient un chiffre ?

Solution

< /etc/passwd egrep '^[^:]*[0-9][^:]*' 

Cette commande recherche sur son entrée standard, qui a été redirigée par le shell vers le fichier /etc/passwd, toutes les lignes dont le début (^) commence par une chaîne constituée d’une suite éventuellement vide de caractères différents du caractère : ([^:]*), suivie d’un chiffre ([0-9]) suivi d’une chaîne constituée d’une suite éventuellement vide de caractères différents du caractère : ([^:]*).

2. Exercice 2 

Extraire de la commande /bin/ls -l toutes les lignes correspondant à un fichier régulier accessible en écriture pour tout le monde.

Donner deux solutions différentes, l’une avec grep et l’autre avec egrep.

Solution 1

Avec grep, on peut écrire la commande suivante :

/bin/ls -l | grep '^-.......w' 

qui va afficher toutes les lignes commençant par un tiret (-) désignant un fichier régulier, suivi d’une suite de 7 caractères quelconques (.......), suivie du caractère w.

Solution 2

Avec egrep, on peut écrire la commande suivante :

/bin/ls -l | egrep '^-.{7}w' 

qui va afficher toutes les lignes commençant (^) par un tiret (-), suivi d’une suite de 7 caractères quelconques (.{7}), suivie du caractère w.

3. Exercice 3 

Comment afficher les lignes du fichier stop.data les lignes contenant les mots :

  • stop,

  • stopping,

  • stopped,

indifféremment en minuscules ou majuscules, en colorisant le mot correspondant ?

On utilisera le fichier de données stop.data suivant :

Ligne 1 : abcd stop 123  
Ligne 2 : The server is stopping ...  
Ligne 3 : Service 1 is starting.  
Ligne 4 : The server has stopped.  
Ligne 5 : Service 2 is starting.  
Ligne 6 : STOP !!!  
Ligne 7 : STOPPPPP !!!!!! 

On proposera plusieurs solutions, dont au moins une avec grep et une avec egrep.

Solution 1

grep --color -i '\<stop[a-z]*' stop.data 

Le résultat sera :

Ligne 1 : abcd stop 123  
Ligne 2 : The server is stopping ...  
Ligne 4 : The server has stopped.  
Ligne 6 : STOP !!!  
Ligne 7 : STOPPPPP !!!!!! 

Cette...