Grep est un bon exemple de la puissance des commandes Linux, en particulier si l’on combine plusieurs d’entre elles. A la base, grep sert à repérer des chaînes de caractères dans un ou plusieurs fichiers eux-mêmes situés dans un ou plusieurs répertoires. Si l’on associe cette commande aux options disponibles, nous obtenons un outil dont il devient difficile de se passer…
Qu’est-ce que le Grep ?
La commande grep de Linux/Unix a pour fonction de rechercher des chaînes de caractère dans un ou plusieurs fichiers. Le terme est l’abréviation de Global Regular Expression Print.
Si l’on décortique cette expression, la fonction de grep devient plus explicite :
- Global : indique que l'action de grep sera appliquée à l'ensemble du texte fourni en input (entrée).
- Regular Expression : spécifique que des expressions régulières vont être mises à contribution. Elles vont ouvrir la porte à des recherches élaborées.
- Print : indique que les « matching lines » (lignes correspondantes à la recherche) seront affichées (imprimées à l’écran) en réponse à la commande.
Quelle est la syntaxe de grep ?
La syntaxe de base est la suivante :
grep pattern [fichier...]
pattern : le modèle ou l'expression sous forme de texte, pour laquelle nous recherchons une correspondance
fichier : le ou les fichiers dans lesquels vont être effectués la recherche.
Habituellement, la commande va inclure des options ou des paramètres qui vont aider à affiner la commande. La syntaxe sera alors la suivante :
grep [options] pattern [fichier...]
Comment utiliser grep ?
Imaginons que nous avons un fichier appelé “clients.txt” qui contient plusieurs lignes de texte dont celles-ci :
Gérard Martin
Pauline Delfosse
Hubert Martin
georges cagneux
daniel martin
…
Si l’on souhaite trouver toutes les « matching lines » (occurrences) ou le nom de famille « Martin ». La command line exploitant grep devrait s’écrire ainsi :
grep "Martin" clients.txt
L’output (sortie) d’une telle commande serait la suivante :
Gérard Martin
Hubert Martin
Quelles sont les options de grep ?
La commande grep fourmille d’options en tous genres et ce sont elles qui lui donnent une réelle puissance d’action. Nous n’allons aborder ici les options courantes et aisées à appréhender :
-i (ignorer la casse)
Dans l’exemple ci-dessus, vous avez pu remarquer que la commande n’a pas retourné la ligne 5 (daniel martin). Il se trouve que grep est sensible à la casse.
Si nous ajoutons l’option –i, la command line listera toutes les occurrences du mot « martin », que la première lettre soit en majuscule ou en minuscule :
grep –i ‘Martin’ clients.txt
donne en retour :
Gérard Martin
Hubert Martin
daniel martin
-v: inverser la correspondance
L’option –v va nous permettre d’afficher toutes les lignes ne comportant pas une certaine occurrence.
grep -vi 'Martin' clients.txt
va afficher en retour toutes lignes ne comportant pas « Martin » ou « martin »
Pauline Delfosse
georges cagneux
Remarquons au passage qu’il est possible d’indiquer plusieurs options à la suite.
-n: Indication du numéro de ligne
Dans l’exemple ci-dessus, nous n’avons que 5 lignes dans le fichier mise à contribution. Toutefois, si nous avions des centaines ou milliers de lignes, il serait fort utile d’avoir les « line numbers » en d’autres termes, l’indication des numéros de ligne.
La command line serait donc la suivante :
grep -ni 'Martin' clients.txt
L’output serait le suivant :
1 : Gérard Martin
3 : Hubert Martin
5 : daniel martin
Quels sont les usages courants de grep ?
Grep est couramment utilisé dans des situations telles que :
Grep dans le débogage
Il arrive fréquemment que l’on opère sur un système complexe, générant de nombreux logs. Rappelons qu’un "log" (journal) sous Linux est un fichier texte qui enregistre les événements intervenant dans le système. Etant donné la luxuriance d’un tel journal, il peut être difficile de repérer certaines informations précises.
Grep va nous permettre de filtrer ces logs afin de ne faire apparaître que les lignes concernant certains mots-clés ou expressions. Ainsi, lors du débogage d’applications, il pourrait être utile d’isoler toutes les lignes de logs contenant le mot « ERROR ». La syntaxe serait alors la suivante :
grep ‘ERROR” /var/log/test.log
Cette commande va afficher toutes les lignes du fichier test.log qui contiennent le mot "ERROR".
Grep dans la recherche au sein de fichiers
Nous avons vu plus haut comment rechercher une chaîne de caractère dans un fichier (soit les « string matching » ou chaînes de caractères en correspondance).
Il est également possible de faire de même dans un répertoire comportant plusieurs fichiers. Imaginons que nous ayons plusieurs fichiers (clients.txt, relations.txt, prospects.txt, etc.) dans un même répertoire baptisé “gestion”. Pour trouver les occurrences de « Martin » dans tous les fichiers ce répertoire, la command line serait :
grep –i ‘Martin’ gestion/*.txt
Grep sait aussi opérer des recherches dites « récursives », balayant plusieurs répertoires, grâce une option : -r.
Comment combiner grep avec d’autres commandes ?
Il est courant dans Linux d’utiliser des pipes, soit le symbole (|) pour combiner des tâches. Le plus simple consiste à prendre un exemple pour illustrer un tel usage, là encore sur le même fichier clients.txt présenté plus haut.
Ainsi, la commande wc sert à compter des éléments dans Linux : un nombre de caractères, de mots, de lignes… « wc –l » va compter un nombre de lignes. Voici un exemple d’usage avec grep :
grep -i 'Martin' clients.txt | wc -l
Ici nous recherchons les occurrences du mot « Martin » et « martin » et souhaitons obtenir, grâce au pipe, le nombre de lignes correspondantes. L’output line sera donc la suivante :
3
Grep, la commande la plus populaire de Linux
En résumé, grep est l'un des outils les plus puissants et polyvalents de l'écosystème Linux/Unix.
Cette commande sera utile à :
- Un administrateur système cherchant à repérer des erreurs dans des logs
- Un développeur soucieux de localiser des bugs dans un code source de grande taille
- Un chercheur souhaitant filtrer des données complexes
Bref, grep est exploitable dans une vaste gamme de situations, allant du débogage à l'analyse de données mais il est aussi possible de mettre cette commande à profit dans la surveillance en temps réel de systèmes critiques.
Retenons donc que grep est davantage qu'une simple commande de recherche de texte : il s’agit d’un outil essentiel pour tout utilisateur de Linux, qui ne peut qu’aider à rendre notre travail plus efficace.