Qu'est-ce que GREP dans Linux et comment l'utiliser

Une photographie d'une personne travaillant sur son ordinateur portable.

Grep est un petit programme UNIX destiné à trouver des motifs correspondants. Premièrement publié dans V6 UNIX, vous pouvez maintenant le trouver sur presque tous les systèmes de type UNIX comme Linux, macOS et même les BSD. Dans cet article, je vais parcourir les bases de Grep et vous montrer quelques exemples de son utilisation pour des tâches quotidiennes.

Les Bases de l’Utilisation de Grep

Au cœur de Grep se trouve un programme simple et direct. Il prend une entrée, trouve le texte que vous souhaitez dans cette entrée et imprime les correspondances en sortie. Grep peut traiter presque n’importe quelle source de texte brut. Cela lui permet de lire des entrées provenant d’autres commandes et de parcourir les fichiers directement.

Le moyen le plus simple de commencer avec Grep est de lire des données à partir d’un fichier texte. Par exemple, la commande suivante imprime le contenu de mon fichier sample.txt :

grep '' sample.txt

De plus, vous pouvez utiliser cette fonctionnalité pour rechercher et trouver des morceaux spécifiques de texte dans vos fichiers texte :

grep 'mot' sample.txt

Un terminal montrant la fonctionnalité simple de correspondance de mots de Grep.

Vous pouvez également utiliser Grep avec des pipes UNIX, vous permettant de coller plusieurs programmes dans une seule commande :

cat sample.txt | grep ''

Un terminal montrant Grep imprimant l'ensemble du fichier lorsqu'il est exécuté sans arguments.

Bon à savoir : souhaitez-vous élargir vos connaissances UNIX ? Apprenez comment fonctionnent les pagers d’écran dans Linux en consultant notre fiche technique pour GNU less.

Trouver des Fichiers dans un Répertoire

Une des tâches les plus faciles que vous pouvez réaliser avec Grep est de trouver des fichiers dans une liste de répertoires. Pour ce faire, vous pouvez envoyer la sortie de la commande ls via un pipe UNIX directement à Grep.

La commande suivante va imprimer et mettre en surbrillance tous les fichiers de votre dossier Téléchargements avec l’extension de fichier .jpg :

ls ~/Téléchargements | grep \\.jpg

Un terminal montrant Grep filtrant les listes de fichiers en fonction de l'extension de fichier.

Vous pouvez également envoyer une sortie ls plus élaborée à Grep et l’utiliser pour trouver des motifs. Par exemple, la commande suivante liste tous les fichiers du répertoire de moins de 1 Mo :

ls -lh ./ | grep .K

Oublier la Casse

Par défaut, presque tous les programmes dans un système de type UNIX sont sensibles à la casse. Cela signifie que le système traite la chaîne « Hello » différemment de « hello », « hEllo » et « helLo ».

Un terminal montrant le comportement par défaut sensible à la casse de Grep.

Ce comportement peut être pénible lors de la recherche de chaînes dans des fichiers. Par exemple, une dissertation peut contenir à la fois « Hello » et « hello » en même temps. Pour y remédier, exécutez Grep avec le drapeau -i suivi de la chaîne que vous voulez trouver.

grep -i Hello hello.txt

Un terminal montrant le drapeau -i désactivant la sensibilité à la casse de Grep.

Recherches Récursives

Grep peut rechercher dans plusieurs fichiers ou répertoires en même temps. Cela est utile si vous travaillez sur un projet avec plusieurs fichiers et que vous souhaitez savoir où une chaîne de texte apparaît dans un répertoire. Par exemple, la commande suivante correspond au mot « MakeTechEasier » dans le répertoire « sample » :

grep -r 'MakeTechEasier' ./sample

Cela dit, l’utilisation du drapeau -r incitera également Grep à parcourir tous les fichiers dans votre répertoire cible. Cela peut poser problème si vous avez également des fichiers non texte dans le dossier que vous recherchez. Pour éviter cela, exécutez Grep avec le drapeau -I :

grep -rI 'MakeTechEasier' ./sample

À noter : apprenez comment vous pouvez créer des fichiers dans le terminal en utilisant la commande touch.

Correspondre aux Fichiers Contenant une Chaîne

En plus d’afficher où une chaîne spécifique se produit dans différents fichiers, vous pouvez également utiliser Grep pour créer une liste de fichiers qui contiennent votre texte cible. Cela est utile si vous voulez savoir si un fichier contient une chaîne particulière mais ne souhaitez pas que Grep imprime chaque instance dans le terminal.

Pour ce faire, exécutez Grep avec les drapeaux -r et -l suivi de la chaîne que vous souhaitez correspondre et du répertoire que vous souhaitez examiner :

grep -rl MakeTechEasier ./sample

Vous pouvez même encapsuler votre commande Grep dans un sous-shell Bash pour créer plusieurs conditions pour votre correspondance de texte. Par exemple, la ligne de code suivante ne renverra que les fichiers contenant à la fois « Hello » et « MakeTechEasier » dans le dossier « sample » :

grep -rl MakeTechEasier $(grep -rl Hello ./sample)

Trouver l’Opposé

En plus de faire des recherches directes, Grep peut également renvoyer les résultats qui ne correspondent pas à vos critères initiaux. Bien que cela puisse sembler contre-intuitif au début, cela peut être utile dans les cas où vous devez mettre en évidence des erreurs et des anomalies dans votre entrée de texte.

Pour ce faire, exécutez Grep avec -v ainsi que les autres drapeaux que vous souhaitez activer. Par exemple, ce qui suit recherchera de manière récursive dans chaque fichier de mon dossier « /etc/nginx » et renverra toutes les lignes qui ne contiennent pas la chaîne « nginx » :

grep -rv 'nginx' /etc/nginx

Un terminal montrant le drapeau d'inversion de Grep qui correspond à tout sauf la chaîne cible.

Mots et Lignes

Il peut également être utile de dire à Grep de rechercher des mots ou des lignes complets, au lieu de n’importe quoi contenant un certain motif. Cela est utile si vous faites correspondre une chaîne de caractères qui est courante dans de nombreux mots. Par exemple, faire correspondre le mot « it » renverra de nombreux faux positifs puisque « it » est une chaîne courante à trouver dans des mots.

Pour résoudre cela, vous pouvez exécuter Grep avec le drapeau -w suivi du mot que vous souhaitez correspondre :

cat it.txt | grep -w it

Un terminal montrant le drapeau de correspondance de mot entier pour Grep.

Au lieu d’imprimer chaque mot contenant le motif, Grep n’imprimera que le mot par lui-même. Il fait la même chose pour des lignes entières avec le drapeau -x, donc si vous recherchez une phrase ou une seule ligne dans un fichier de configuration, cela peut vraiment aider.

Ajouter des Numéros de Ligne à la Sortie de Grep

Les numéros de ligne sont une partie importante du débogage des programmes et de la relecture des textes. Cela vous permet de référencer avec précision l’emplacement d’une fonction ou d’une phrase spécifique, ce qui facilite considérablement les corrections et les modifications.

À cet égard, Grep a la capacité d’imprimer les numéros de ligne dans sa sortie par défaut. Pour ce faire, exécutez le programme avec le drapeau -n suivi de la chaîne que vous souhaitez correspondre :

grep -n main ./my-code.c

Avec l’aide des pipes UNIX, vous pouvez également modifier la sortie de Grep et n’imprimer que les numéros de ligne de ce que vous recherchez. Cela rend l’analyse de longs textes beaucoup plus propre et plus facile :

grep -n Sed essai.txt | cut -f1 -d :

FYI : Les pipes UNIX sont plus qu’un simple outil pour Grep. Apprenez à automatiser vos tâches de shell distant en créant et en utilisant des pipes SSH.

Utiliser des Regex Étendues avec Grep

Grep utilise le jeu de métacaractères d’Expression Régulière de Base (BRE) pour faire correspondre et filtrer les chaînes de texte. Bien que cela fonctionne généralement pour la plupart des tâches, certains utilisateurs peuvent le trouver limité, surtout lorsqu’ils travaillent avec des groupes de motifs.

Pour y remédier, la plupart des implémentations de Grep offrent le drapeau -E, qui permet au programme d’analyser les métacaractères d’Expression Régulière Étendue (ERE). Par exemple, la commande suivante ne fonctionnera qu’avec le drapeau -E :

printf "hello\nhellooooo\n" | grep -E .*o{2}$

Remarque : la version GNU de Grep utilise certaines fonctionnalités ERE par défaut. Cependant, il est bon de pratiquer l’utilisation de -E chaque fois que vous utilisez ERE pour préserver la compatibilité avec d’autres systèmes de type UNIX.

En outre, Grep a également un mode spécial qui abandonne complètement toutes les fonctions Regex. Pour utiliser cela, exécutez le programme avec le drapeau -F suivi de votre chaîne simple :

grep -F [MakeTechEasier] ./fixed.txt

Ajouter des Lignes Adjacentes à la Sortie de Grep

Une des forces principales de Grep est de montrer où le texte apparaît dans votre fichier ou flux d’entrée. Cependant, il existe des cas où connaître uniquement l’emplacement exact d’une chaîne ne suffit pas lors de la résolution de problèmes. Par exemple, un journal de crash fournit généralement un contexte supplémentaire avant d’imprimer le traditionnel message « Segmentation Fault ».

Une façon de résoudre ce problème est d’exécuter Grep avec le drapeau -C suivi du nombre de lignes que vous souhaitez imprimer autour de votre texte cible. La commande suivante imprime cinq lignes avant et après votre correspondance de texte :

grep -C 5 'Hello' ./hello-sample.txt

Un terminal montrant la capacité de Grep à imprimer le contexte environnant d'une chaîne cible.

Vous pouvez également personnaliser si Grep n’imprime que le contexte précédent ou suivant avec les drapeaux -B et -A. Par exemple, la commande suivante imprimera les dix lignes précédentes après votre chaîne cible :

grep -A 10 'Hello' ./hello-sample.txt

Un terminal montrant Grep imprimant les 10 lignes suivantes après sa correspondance de chaîne initiale.

Avec les bases de Grep et comment l’utiliser pour vos tâches quotidiennes sous contrôle, vous pouvez maintenant faire votre premier pas vers la compréhension de la ligne de commande et des utilitaires UNIX de base. Explorez ce monde très divers et profond en apprenant comment fonctionne sed dans Linux.