Comment exclure des modèles, des fichiers et des répertoires avec grep
Depuis 1974, Linux grep
La commande aide les gens à trouver des chaînes dans des fichiers. Mais parfois grep
est tout simplement trop minutieux. Voici plusieurs façons de dire grep
ignorer différentes choses.
Sommaire
La commande grep
La grep
La commande recherche dans les fichiers texte les chaînes qui correspondent aux modèles de recherche que vous fournissez sur la ligne de commande. Le pouvoir de grep
réside dans son utilisation des expressions régulières. Ceux-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érieur à 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 dans le ed
éditeur de ligne (d’ailleurs, prononcé « ee-dee »). Cela représentait gglobal, concernantrecherche express régulière, pimprimer les lignes correspondantes.
grep
est célèbre – peut-être, notoirement – minutieux et déterminé. Parfois, il recherchera des fichiers ou des répertoires sur lesquels vous préféreriez ne pas perdre son temps, car les résultats peuvent vous empêcher de voir le bois pour les arbres.
Bien sûr, il existe des moyens de maîtriser grep. Vous pouvez lui dire d’ignorer les modèles, les fichiers et les répertoires afin que grep termine ses recherches plus rapidement et que vous ne soyez pas submergé de faux positifs sans signification.
Exclusion de motifs
Pour rechercher avec grep
vous pouvez y diriger l’entrée d’un autre processus tel que cat
ou vous pouvez fournir un nom de fichier comme dernier paramètre de ligne de commande.
Nous utilisons un fichier court qui contient le texte du poème Jabberwocky, de Lewis Caroll. Dans ces deux exemples, nous recherchons des lignes qui correspondent au terme de recherche « Jabberwock ».
cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock" jabberwocky.text
Les lignes qui contiennent des correspondances avec l’indice de recherche sont répertoriées pour nous, avec l’élément correspondant dans chaque ligne surligné en rouge. C’est une recherche simple. Mais que se passe-t-il si nous voulons exclure les lignes contenant le mot « Jabberwock » et imprimer le reste ?
Nous pouvons accomplir cela avec le -v
(inverser la correspondance). Ceci répertorie les lignes qui ne correspondent pas au terme de recherche.
grep -v "Jabberwock" jabberwocky.text
Les lignes qui ne contiennent pas « Jabberwock » sont répertoriées dans la fenêtre du terminal.
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 y parvenir, nous utiliserons le -e
option (expression). Nous devons l’utiliser pour chaque modèle de recherche que nous utilisons.
grep -v -e "Jabberwock" -e "and" jabberwocky.txt
Il y a une baisse correspondante du nombre de lignes dans la sortie.
Si nous utilisons le -E
(expressions régulières étendues), nous pouvons combiner les modèles de recherche avec « |
« , qui dans ce contexte n’indique pas un tuyau, c’est la logique OR
opérateur.
grep -Ev "Jabberwock|and" jabberwocky.txt
Nous obtenons exactement le même résultat 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 regex au lieu d’un indice de recherche explicite. Cette commande exclura toutes les lignes commençant par n’importe quelle lettre dans l’ensemble de « ACHT ».
grep -Ev "^ACHT" jabberwocky.txt
Pour voir les lignes qui contiennent un motif mais qui n’en contiennent pas non plus, nous pouvons diriger grep
dans grep
. Nous allons rechercher toutes les lignes contenant le mot « Jabberwock », puis filtrer toutes les lignes qui aussi contenir le mot « tué ».
grep "Jabberwock" jabberwocky.txt | grep -v "slain"
Exclusion de fichiers
Nous pouvons demander grep
pour rechercher une chaîne ou un motif dans une collection de fichiers. Vous pouvez répertorier 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 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. Cela semble fonctionner.
grep "vorpal" *.txt
Cependant, dans ce répertoire, il existe d’autres fichiers TXT, qui n’ont rien à voir avec le poème. Si nous recherchons le mot « épée » avec la même structure de commande, nous obtenons beaucoup de faux positifs.
grep "sword" *.txt
Les résultats que nous voulons sont masqués par le déluge de faux résultats des autres fichiers qui ont l’extension TXT.
Le mot « vorpal » ne correspondait à rien, mais « épée » est inclus dans le mot « mot de passe », il a donc été trouvé plusieurs fois dans certains pseudo-fichiers journaux.
Nous devons exclure ces fichiers. Pour ce faire, nous utiliserons le --exclude
option. Pour exclure un seul fichier appelé « 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 le -R
(déréférencement-récursif) option grep
recherchera des arborescences entières de répertoires pour nous. Par défaut, il recherchera dans tous les fichiers de 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 y a des répertoires imbriqués 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 --exclude
option 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 qui ont des extensions CSV ou MD, et 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 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 de fichiers, sauf que nous utilisons le --exclude-dir
option et nommez 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 appelé « backup2 ».
Il ne sera pas surprenant que nous puissions utiliser le --exclude-dir
option plusieurs fois dans une seule commande. Notez que le chemin vers les répertoires exclus doit être donné par rapport au répertoire dans lequel la recherche commencera. 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
Nous pouvons aussi utiliser des groupements. Nous pouvons réaliser la même chose plus succinctement avec :
grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data
Vous pouvez combiner des exclusions de fichiers et de répertoires dans la même commande. Si vous souhaitez exclure tous les fichiers d’un répertoire et exclure certains types de fichiers des répertoires qui sommes recherché, utilisez cette syntaxe :
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data
Parfois, c’est ce que vous laissez de côté
Parfois avec grep
on peut avoir l’impression d’essayer de trouver une aiguille dans une botte de foin. cela fait une grande différence d’enlever la botte de foin.