Comment exclure des modèles, des fichiers et des répertoires avec grep
Depuis 1974, l’équipe Linux grep
aide les gens à trouver des lignes dans les fichiers. Mais parfois grep
trop soigneusement. Voici quelques façons de dire grep
ignorer différentes choses.
commande grep
La commande grep
recherche dans les fichiers texte les lignes qui correspondent aux modèles de recherche spécifiés sur la ligne de commande. La puissance grep
ré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 grep
est 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 ed
l’éditeur de ligne (prononcé « ee-dee » en passant). Cela signifiait une recherche express globale et régulière, imprimant les lignes correspondantes.
grep
connu – 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, grep
vous 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’ -v
option (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 -e
option (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’ -E
option (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 OR
opé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 grep
passer 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 grep
rechercher 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’ --exclude
option. 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’ -R
option (déréférencement-récursif), grep
il 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 --exclude
paramè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-dir
paramè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-dir
option 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