Depuis 1974, la commande grep de Linux aide les gens à trouver des chaînes de caractères dans les fichiers. Mais parfois, grep est tout simplement trop minutieux. Voici plusieurs façons d’indiquer à grep d’ignorer différentes choses.

LES CHROMEBOOKS PEUVENT DÉSORMAIS DÉCOMPRESSER PLUS QUE DES FICHIERS ZIP

La commande grep

La commande grep recherche dans les fichiers texte les chaînes de caractères qui correspondent aux modèles de recherche que vous fournissez sur la ligne de commande. La puissance de grep réside dans son utilisation des expressions régulières. Celles-ci vous permettent de décrire ce que vous recherchez, plutôt que de devoir le définir explicitement.

La naissance de grep est antérieure à Linux. Il a été développé au début des années 1970 sur Unix. Il tire son nom de la séquence de touches g/re/p de l’éditeur de ligne ed (qui se prononce d’ailleurs « ee-dee »). Cela signifiait global, regular express search, print matching lines.

grep est célèbre – peut-être même notoire – pour sa minutie et sa détermination. Il lui arrive de rechercher des fichiers ou des répertoires sur lesquels vous préféreriez qu’il ne perde pas son temps, car les résultats peuvent vous empêcher de voir la forêt pour les arbres.

Bien sûr, il existe des moyens de maîtriser grep. Vous pouvez lui demander d’ignorer les motifs, les fichiers et les répertoires afin que grep effectue ses recherches plus rapidement et que vous ne soyez pas submergé par des faux positifs sans intérêt.

Exclusion des motifs

Pour effectuer une recherche avec grep, vous pouvez lui transmettre les données d’un autre processus, comme cat , ou fournir un nom de fichier comme dernier paramètre de la ligne de commande.

Nous utilisons un fichier court qui contient le texte du poème Jabberwocky, de Lewis Carroll. Dans ces deux exemples, nous recherchons les lignes qui correspondent au terme de recherche « Jabberwocky ».

cat jabberwocky.txt | grep « Jabberwock » (en anglais)

grep « Jabberwock » jabberwocky.text

Deux façons différentes de rechercher dans le même fichier texte avec grep

Les lignes qui contiennent des correspondances avec l’indice de recherche sont listées pour nous, avec l’élément correspondant dans chaque ligne surligné en rouge. C’est une recherche simple. Mais que faire si nous voulons exclure les lignes qui contiennent le mot « Jabberwock » et afficher le reste ?

Nous pouvons le faire avec l’option -v (invert match). Celle-ci liste les lignes qui ne correspondent pas au terme recherché.

grep -v « Jabberwock » jabberwocky.text

Utilisation de l’option de recherche inversée -v avec grep

Les lignes qui ne contiennent pas « Jabberwock » sont listées dans la fenêtre du terminal.

Toutes les lignes qui ne contiennent pas le mot jabberwock

Nous pouvons exclure autant de termes que nous le souhaitons. Filtrons toutes les lignes qui contiennent « Jabberwock » et toutes les lignes qui contiennent « et ». Pour ce faire, nous allons utiliser l’option -e (expression). Nous devons l’utiliser pour chaque modèle de recherche que nous utilisons.

grep -v -e « Jabberwock » -e « and » jabberwocky.txt

Utilisation de plusieurs clauses de recherche avec grep

Il y a une baisse correspondante du nombre de lignes dans la sortie.

Les lignes du texte qui ne correspondent à aucun des termes de recherche

Si nous utilisons l’option -E (regex étendus), nous pouvons combiner les motifs de recherche avec « | », qui dans ce contexte n’indique pas un tuyau, mais l’opérateur logique OR.

grep -Ev « Jabberwock|et » jabberwocky.txt

Utilisation de l’opérateur OR logique avec grep

Nous obtenons exactement le même résultat qu’avec la commande précédente, plus longue.

Les lignes du texte qui ne correspondent à aucun des deux termes de recherche.

Le format de la commande est le même si vous souhaitez utiliser un modèle regex au lieu d’un indice de recherche explicite. Cette commande exclura toutes les lignes qui commencent par une lettre quelconque de l’ensemble « ACHT ».

grep -Ev « ^ACHT » jabberwocky.txt

Exclusion des fichiers qui commencent par des lettres particulières

Pour voir les lignes qui contiennent un motif mais qui ne contiennent pas non plus un autre motif, nous pouvons utiliser grep dans grep . Nous allons rechercher toutes les lignes qui contiennent le mot « Jabberwock » et ensuite filtrer toutes les lignes qui contiennent également le mot « slain ».

grep « Jabberwock » jabberwocky.txt | grep -v « slain »

Piping grep dans grep pour filtrer deux fois

Exclusion de fichiers

Nous pouvons demander à grep de rechercher une chaîne ou un motif dans une collection de fichiers. Vous pourriez lister chaque fichier sur la ligne de commande, mais avec de nombreux fichiers, cette approche n’est pas adaptée.

grep « vorpal » vers-1.txt vers-2.txt vers-3.txt vers-4.txt vers-5.txt vers-6.txt

Recherche dans une liste de fichiers nommés

Notez que le nom du fichier contenant la ligne correspondante est affiché au début de chaque ligne de sortie.

Pour réduire la saisie, nous pouvons utiliser des caractères génériques. Mais cela peut être contre-intuitif. Ceci semble fonctionner.

grep « vorpal » *.txt

Utilisation de caractères de remplacement pour rechercher un ensemble de fichiers

Cependant, dans ce répertoire, il y a d’autres fichiers TXT, qui n’ont rien à voir avec le poème. Si nous recherchons le mot « sword » avec la même structure de commande, nous obtenons beaucoup de faux positifs.

grep « sword » *.txt

Recherche de « sword » dans une collection de fichiers TXT.

Les résultats que nous voulons sont masqués par le déluge de faux résultats provenant des autres fichiers qui ont l’extension TXT.

Un grand ensemble de résultats faussement positifs

Le mot « vorpal » ne correspond à rien, mais « sword » est inclus dans le mot « password » et a donc été trouvé de nombreuses fois dans certains pseudo-logfiles.

Nous devons exclure ces fichiers. Pour ce faire, nous utiliserons l’option –exclude. Pour exclure un seul fichier appelé « vol-log-1.txt », nous utiliserons cette commande :

grep –exclude=vol-log-1.txt « sword » *.txt

Dans ce cas, nous voulons exclure plusieurs fichiers journaux dont le nom commence par « vol ». La syntaxe dont nous avons besoin est la suivante :

grep –exclude=vol*.txt « sword » *.txt

Exclusion de fichiers avec des caractères génériques

Lorsque nous utilisons l’option -R (déréférencement-récursif), grep recherche des arborescences de répertoires entières pour nous. Par défaut, il recherchera tous les fichiers dans ces emplacements. Il peut y avoir plusieurs types de fichiers que nous souhaitons exclure.

Sous le répertoire actuel de cette machine de test, il existe des répertoires imbriqués contenant des fichiers journaux, des fichiers CSV et des fichiers MD. Ce sont tous des types de fichiers texte que nous voulons exclure. Nous pourrions utiliser une option –exclude pour chaque type de fichier, mais nous pouvons obtenir ce que nous voulons plus efficacement en regroupant les types de fichiers.

Cette commande exclut tous les fichiers dont l’extension est CSV ou MD, et tous les fichiers TXT dont le nom commence par « vol » ou « log ».

grep -R –exclude=.{csv,md} –exclude={vol,log*}.txt « sword » /home/dave/data/

Utilisation de clauses –exclude multiples et de regroupements de noms de fichiers

Exclusion de répertoires

Si les fichiers que nous voulons ignorer sont contenus dans des répertoires et qu’il n’y a aucun fichier dans ces répertoires que nous voulons rechercher, nous pouvons exclure ces répertoires entiers.

Le concept est très similaire à celui de l’exclusion des fichiers, sauf que nous utilisons l’option –exclude-dir et que nous nommons les répertoires à ignorer.

grep -R –exclude-dir=backup « vorpal » /home/dave/data

Exclusion d’un répertoire de la recherche

Nous avons exclu le répertoire « backup », mais nous cherchons toujours dans un autre répertoire appelé « backup2 ».

Il n’est pas surprenant que nous puissions utiliser l’option –exclude-dir plusieurs fois dans une seule commande. Notez que le chemin d’accès aux répertoires exclus doit être donné relativement au répertoire dans lequel la recherche va commencer.

N’utilisez pas le chemin absolu à partir de la racine du système de fichiers.

grep -R –exclude-dir=backup –exclude-dir=backup2 « vorpal » /home/dave/data

Exclusion de deux répertoires de la recherche

Nous pouvons également utiliser des groupements. Nous pouvons obtenir la même chose de manière plus succincte avec :

grep -R –exclude-dir={backup,backup2} « vorpal » /home/dave/data

Exclusion de répertoires avec regroupement

Vous pouvez combiner les exclusions de fichiers et de répertoires dans la même commande. Si vous voulez exclure tous les fichiers d’un répertoire et exclure certains types de fichiers des répertoires recherchés, utilisez cette syntaxe :

grep -R –exclude=*.{csv,md} –exclude-dir=backup/archive « frumious » /home/dave/data

Exclusion de types de fichiers et de répertoires dans la même commande

Parfois, c’est ce que vous laissez de côté

Parfois, avec grep, on peut avoir l’impression de chercher une aiguille dans une botte de foin. Cela fait une grande différence de supprimer la botte de foin.