GREP – Globally search for Regular Expression and Print it

Qui, travaillant sous Unix ou Linux, n’a jamais utilisé la commande grep? La réponse est simple il me semble: personne!!!
Pour faire simple, grep est une petite famille de 3 commandes qui permet de rechercher une chaine dans des fichiers, et d’en imprimer les lignes.
Elle n’a l’air de rien comme cela, mais c’est une commande terriblement efficace, l’une des commandes les plus utiles dans tout système Unix, avec sed et awk.

Présentation

g/RE/p signifie globally search for RE and print it où RE est un raccourci pour RegularExpression.
Pour faire ultra simple, grep est un outil qui permet de chercher une expression régulière (motif ou pattern en anglais) dans un contenu, et d’en afficher le résultat.

Expression régulière ?

Les expressions régulières, ou plus communément appelées RegEx, constituent un système puissant et rapide afin de rechercher dans des chaînes de caractères un motif (une occurrence, une autre chaine de caractères définie). On utilise les expressions régulières dans presque toutes les commandes d’administration. On peut les retrouver dans de nombreux langages comme le BASH, le PHP, Javascript, etc… ou encore dans des logiciels d’édition, comme vi, Notepad++, PsPad, etc… .
C’est pour quoi, je ne développerai pas plus sur les RegEx ici, car des livres complets existent sur ce sujet, et un article entier serait une bonne façon des aborder, plutôt que quelques lignes posées dans un paragraphe.

Fonctionnement

Ces trois commandes grep fonctionnent de la même façon.
Grep commence à lire la première ligne du fichier (ou depuis l’entrée standard si aucun fichier n’est fourni, ou si le nom – est mentionné) , la copie dans un tampon, la compare à la chaîne de recherche (le motif), et si la comparaison est valide, imprime la ligne à l’écran. Grep va ainsi répéter ce processus jusqu’à la fin du fichier (ou de l’entrée standard).

Les symboles

On va d’abord vite faire le tour des symboles que nous pouvons utiliser dans les expressions régulières.
Les caractères ^ et $ indiquent le début ou la fin d’une chaîne, et permettent donc de la délimiter.
« ^debut »: chaîne qui commence par « debut »
« fin$ »: chaîne qui se termine par « fin »

Les caractères *, + et ?, respectivement zero ou plusieurs, un ou plusieurs, un ou aucun, permettent de donner une notion de nombre.
« abc+ »: chaîne qui contient « ab » suivie de un ou plusieurs « c » (« abc », « abcc » …)
« abc* »: chaîne qui contient « ab » suivie de zero ou plusieurs « c » (« ab », « abc » …)
« abc? »: chaîne qui contient « ab » suivie de zero ou un « c » (« ab » ou « abc »)

Les accolades {,} permettent de donner des limites de nombre.
« abc{2} »: chaîne qui contient « ab » suivie de deux « c » (« abcc »)
« abc{2,} »: chaîne qui contient « ab » suivie de deux « c » ou plus (« abcc » etc..)
« abc{2,4} »: chaîne qui contient « ab » suivie 2, 3 ou 4 « c » (« abcc » .. « abcccc »)

Les parenthèses ( ) permettent de représenter une séquence de caractères.
« a(bc)* »: chaîne qui contient « a » suivie de zero « bc » ou plus

Le pipe (la barre verticale) | se comporte en tant qu’opérateur OU
« un|le »: chaîne qui contient « un » ou « le »
« (un|le) chat »: chaîne qui contient « un chat » ou « le chat »
« (a|b)* »: chaîne qui contient une suite de « a » ou de « b »

Le point . indique n‘importe quel caractère
« ^.{3}$ »: chaîne qui contient 3 caractères

Les crochets [-] définissent une liste de caractères autorisés (ou interdits).
Le signe permet quand à lui de définir un intervalle. Le caractère ^ après le premier crochet indique quand à lui une interdiction.
« [abc] »: chaîne qui contient un « a », un « b », ou un « c »
« [a-z] »: chaîne qui contient un caractère compris entre « a » et « z »
« ^[a-zA-Z] »: chaîne qui commence par une lettre
« ^[^a-zA-Z] »: chaîne qui ne commence pas par une lettre

Des exemples

Oui, parce que c’est bien beau tout cela, mais il faut aussi pratiquer. Vous imaginez qu’on ne va pas non plus faire le tour de la question, mais uniquement faire tomber les premières barrières qui pourraient vous empêcher d’utiliser grep.

Pour des exemples simples, je ne vais pas faire de copier/coller, vous en trouverez ici, et ci-dessous, certains exemple que j’utilise au bureau.

Test les Erreurs dans un fichier de log : il ne faut avoir ni des ORA- ni des PLS- :

Vérifier si une chaine de caractères est présente dans un fichier :

Fonction privée pour valider une adresse email :

Fonction de test si une chaîne de caractères est numérique :

La Famille

Je disais une petite famille, car grep est disponible en trois commandes distinctes mais toutes liées : grep, egrep et fgrep.
Egrep est identique à grep -E.
Fgrep est identique à grep -F.
Rgrep est identique à grep -r.

-E, –extended-regexp
Interpréter le MOTIF comme une expression rationnelle étendue
-F, –fixed-strings
Interpréter le MOTIF comme une liste de chaînes de caractères, séparées par des sauts de ligne. Chacune d’entre elles doit être recherchée.
-r, –recursive
Lire tous les fichiers à l’intérieur de chaque répertoire, récursivement.

 Maintenant, amusez-vous bien, mais je serais curieux de voir cela. Alors n’hésitez pas à publier vos trouvailles.

A propos Mehdi HAMIDA

Moi en quelques mots: je m'appelle Mehdi, j'habite à Lyon, je suis chef de projet technique et papa geek. Je m’intéresse aux nouvelles technologies, à la publicité, la musique, à l’art en général et à la culture 2.0, ainsi qu’à tout ce qui a trait de près ou de loin à Internet : réseaux sociaux, webmarketing, le marketing viral et la veille stratégique.