Comment exclure des modèles, des fichiers et des répertoires avec grep

Comment exclure des modèles, des fichiers et des répertoires avec grep

Depuis 1974, l’équipe Linux grepaide les gens à trouver des lignes dans les fichiers. Mais parfois greptrop soigneusement. Voici quelques façons de dire grepignorer différentes choses.

commande grep

La commande greprecherche dans les fichiers texte les lignes qui correspondent aux modèles de recherche spécifiés sur la ligne de commande. La puissance grepréside dans l’utilisation d’expressions régulières. Ils vous permettent de décrire ce que vous recherchez au lieu de le définir explicitement.

La naissance grepest antérieure à Linux. il a été développé au début des années 1970 pour Unix. Il tire son nom de la séquence de touches g/re/p dans edl’éditeur de ligne (prononcé « ee-dee » en passant). Cela signifiait une recherche express globale et régulière, imprimant les lignes correspondantes.

grepconnu – peut-être notoire – pour être minutieux et déterminé. Parfois, il recherchera des fichiers ou des répertoires sur lesquels vous préférez ne pas perdre votre 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 contrôler grep. Vous pouvez lui dire d’ignorer les modèles, les fichiers et les répertoires afin que grep recherche plus rapidement et que vous ne soyez pas inondé de faux positifs sans signification.

Exclusion de modèle

Pour effectuer une recherche avec, grepvous pouvez diriger l’entrée vers celui-ci à partir d’un autre processus, tel que cat, ou vous pouvez spécifier un nom de fichier comme dernier argument de la ligne de commande.

Nous utilisons un court fichier contenant le texte du poème  Jabberwocky de Lewis Carroll. Dans ces deux exemples, nous recherchons des chaînes correspondant au terme de recherche « jabberwock ».

cat jabberwocky.txt | grep "Jabberwock"grep "Jabberwock"jabberwocky.text

Les lignes qui contiennent des correspondances avec un indice de recherche sont répertoriées pour nous, avec l’élément correspondant dans chaque ligne surligné en rouge. Il s’agit d’une recherche directe. Mais que se passe-t-il si nous voulons exclure les lignes contenant le mot « Jabberwock » et imprimer le reste ?

Nous pouvons y parvenir avec l’ -voption (correspondance inversée). Cela répertorie les chaînes qui ne correspondent pas à la requête de recherche.

grep -v "Jabberwock"jabberwocky.text

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

Nous pouvons exclure autant de termes que nous le souhaitons. Filtrons toutes les lignes contenant « Jabberwock » et toutes les lignes contenant « et ». Pour cela nous allons utiliser une -eoption (expression). Nous devons l’utiliser pour chaque modèle de recherche que nous utilisons.

grep -v -e "Jabberwock"-e "and"jabberwocky.txt

Une diminution correspondante du nombre de lignes dans la sortie.

Si nous utilisons l’ -Eoption (expressions régulières étendues), nous pouvons combiner les modèles de recherche avec  » |« , qui dans ce contexte n’indique pas un canal, c’est un ORopérateur logique.

grep -Ev "Jabberwock|and"jabberwocky.txt

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

Le format de la commande est le même si vous souhaitez utiliser un modèle d’expression régulière au lieu d’un indice de recherche explicite. Cette commande exclura toutes les lignes commençant par n’importe quelle lettre de l’ensemble « ACHT ».

grep -Ev "^ACHT"jabberwocky.txt

Pour voir les lignes qui contiennent un motif mais pas un autre motif, nous pouvons greppasser grep. Nous rechercherons toutes les lignes contenant le mot « jabberwock » puis filtrerons toutes les lignes qui contiennent également le mot « tué ».

grep "Jabberwock"jabberwocky.txt | grep -v "slain"

Exclusion de fichiers

Nous pouvons demander de greprechercher une chaîne ou un motif dans un ensemble de fichiers. Vous pouvez lister chaque fichier sur la ligne de commande, mais avec de nombreux fichiers, cette approche ne s’adapte pas.

grep "vorpal"verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt

Notez que le nom du fichier contenant la ligne correspondante apparaît au début de chaque ligne de sortie.

Pour raccourcir l’entrée, nous pouvons utiliser des caractères génériques. Mais cela peut être contre-intuitif. Cela semble fonctionner.

grep "vorpal"*.txt

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

grep "sword"*.txt

Les résultats dont nous avons besoin sont masqués par un flux de faux résultats provenant d’autres fichiers TXT.

Le mot « vorpal » ne correspondait à rien, mais le mot « sword » est inclus dans le mot « password », il est donc apparu plusieurs fois dans certains pseudo-fichiers journaux.

Nous devons exclure ces fichiers. Pour ce faire, nous utilisons l’ --excludeoption. Pour exclure un fichier nommé « vol-log-1.txt », nous utiliserions cette commande :

grep --exclude=vol-log-1.txt "sword"*.txt

Dans ce cas, nous souhaitons exclure plusieurs fichiers journaux dont les noms commencent par « vol ». La syntaxe dont nous avons besoin est :

grep --exclude=vol*.txt "sword"*.txt

Lorsque nous utilisons l’ -Roption (déréférencement-récursif), grepil recherchera toutes les arborescences de répertoires pour nous. Par défaut, il recherchera tous les fichiers dans ces emplacements. Il peut très bien y avoir plusieurs types de fichiers que nous souhaitons exclure.

Sous le répertoire actuel sur cette machine de test, il existe des sous-répertoires contenant des fichiers journaux, des fichiers CSV et des fichiers MD. Ce sont tous les types de fichiers texte que nous voulons exclure. Nous pourrions utiliser un --excludeparamètre 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 avec les extensions .csv ou .md, ainsi que tous les fichiers .txt dont les noms commencent par « vol » ou « log ».

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

Exclure les répertoires

Si les fichiers que nous voulons ignorer sont contenus dans des répertoires et que ces répertoires ne contiennent pas les fichiers que nous voulons trouver, nous pouvons exclure entièrement ces répertoires.

Le concept est très similaire à l’exclusion de fichiers, sauf que nous utilisons un --exclude-dirparamètre et nommons les répertoires à ignorer.

grep -R --exclude-dir=backup "vorpal"/home/dave/data

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

Sans surprise, nous pouvons utiliser cette --exclude-diroption plusieurs fois dans la même commande. Notez que le chemin vers les répertoires exclus doit être relatif au répertoire où la recherche commencera. N’utilisez pas de chemin absolu à partir de la racine du système de fichiers.

grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal"/home/dave/data

On peut aussi utiliser des regroupements. Nous pouvons arriver au même résultat de manière plus concise :

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

Vous pouvez combiner des exclusions de fichiers et de répertoires dans une seule commande. Si vous souhaitez exclure tous les fichiers d’un répertoire et exclure certains types de fichiers des répertoires de recherche, utilisez cette syntaxe :

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *