Comment exclure des modèles, des fichiers et des répertoires avec grep
Publié: 2022-06-29 Depuis 1974, la commande Linux grep
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
d'ignorer différentes choses.
La commande grep
La commande grep
recherche des fichiers texte à la recherche de chaînes correspondant aux modèles de recherche que vous fournissez sur la ligne de commande. La puissance de grep
réside dans son utilisation d'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é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 dans l'éditeur de ligne ed
(d'ailleurs, prononcé « ee-dee »). Cela signifiait une recherche expresse globale et régulière , des lignes de correspondance d'impression.
grep
est réputé – 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 diriger l'entrée vers celui-ci à partir 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 court fichier qui contient le texte du poème Jabberwocky , de Lewis Carroll. Dans ces deux exemples, nous recherchons des lignes qui correspondent au terme de recherche "Jabberwock".
chat 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 l'option -v
(correspondance inversée). 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 ce faire, nous utiliserons l'option -e
(expression). Nous devons l'utiliser pour chaque modèle de recherche que nous utilisons.
grep -v -e "Jabberwock" -e "et" jabberwocky.txt
Il y a une baisse correspondante du nombre de lignes dans la sortie.
Si nous utilisons l'option -E
(expressions régulières étendues), nous pouvons combiner les modèles de recherche avec « |
“, qui dans ce contexte n'indique pas un tube, c'est l'opérateur logique OR
.
grep -Ev "Jabberwock|et" 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
vers grep
. Nous rechercherons toutes les lignes contenant le mot « Jabberwock », puis filtrerons toutes les lignes contenant également le mot « slain ».
grep "Jabberwock" jabberwocky.txt | grep -v "tué"
Exclusion de fichiers
Nous pouvons demander à grep
de 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" verset-1.txt verset-2.txt verset-3.txt verset-4.txt verset-5.txt verset-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 "épée" *.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 l'option --exclude
. Pour exclure un seul fichier appelé "vol-log-1.txt", nous utiliserions cette commande :
grep --exclude=vol-log-1.txt "épée" *.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 "épée" *.txt
Lorsque nous utilisons l'option -R
(déréférencement récursif), grep
recherchera pour nous des arbres de répertoires entiers. 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 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 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 "épée" /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 l'option --exclude-dir
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 appelé "backup2".
Il ne sera pas surprenant que nous puissions utiliser l'option --exclude-dir
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={sauvegarde,sauvegarde2} "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 recherchés , 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 a 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.
CONNEXION: Comment utiliser les expressions régulières (regex) sous Linux