Grep est un excellent outil lorsque vous devez effectuer une recherche sur le contenu d'un fichier.
Habituellement, vous exécutez grep sur un seul fichier comme ceci :
grep search_term filename
Grep est assez polyvalent. Si vous voulez rechercher tous les fichiers dans un répertoire avec grep , utilisez-le comme ceci :
grep search_term *
Il y a un problème avec ça. Il recherche uniquement dans tous les fichiers du répertoire courant. Il ne cherchera pas dans les sous-répertoires.
Vous pouvez faire une recherche grep dans tous les fichiers et tous les sous-répertoires du répertoire courant en utilisant le -r
option de recherche récursive :
grep -r search_term .
Vous pouvez également spécifier le chemin du répertoire si vous n'êtes pas dans le répertoire où vous souhaitez effectuer la recherche :
grep -r search_term directory_path
C'était un bref récapitulatif. Laissez-moi vous montrer tout cela en détail avec des exemples appropriés afin qu'il soit plus facile pour vous de comprendre.
Recherche Grep dans tous les fichiers d'un répertoire
Voici la structure de répertoire que je vais utiliser dans cet exemple. Sauf empty.txt, tous les fichiers contiennent le terme 'simple' sur lequel je vais effectuer la recherche grep.
[email protected]:~/scripts$ tree
.
├── dir1
│ └── new_script.sh
├── dir2
│ └── your_script.sh
├── dir3
│ ├── empty.txt
│ └── linked.txt -> ../../sample.txt
├── my_script.sh
└── your_script.sh
3 directories, 6 files
Pour rechercher le mot 'simple' dans tous les fichiers des répertoires en cours, il suffit d'utiliser le joker (*). Le caractère générique remplace en fait le nom de tous les fichiers et répertoires du répertoire actuel.
grep simple *
Cela recherchera dans tous les fichiers des répertoires actuels, mais n'entrera pas dans les sous-répertoires. Étant donné que vous ne pouvez pas rechercher directement grep sur un répertoire, l'erreur "XYZ est un répertoire" s'affichera avec les résultats de la recherche.

Si vous n'êtes pas dans le même répertoire où vous voulez jouer, vous pouvez spécifier le chemin du répertoire et le terminer par /*
grep search_term directory_path/*
Fondamentalement, vous utilisez le caractère générique pour développer tous les éléments (fichiers et répertoires) du répertoire donné.
Maintenant que vous savez cela, voyons comment vous pouvez effectuer une recherche récursive avec grep afin qu'il examine également les fichiers des sous-répertoires.
Grep recherche récursive dans tous les sous-répertoires d'un répertoire
Grep fournit un -r
option pour la recherche récursive. Avec cette option, grep examinera tous les fichiers du répertoire courant (ou spécifié) et il examinera également tous les fichiers de tous les sous-répertoires.
Voici la recherche récursive que j'ai effectuée dans l'exemple précédent pour effectuer une recherche grep dans le dossier courant :
grep -r simple .
Voici le résultat :

Il y a aussi un -R
option pour la recherche récursive et cela fonctionne presque de la même manière que le -r
option.
grep -R simple .
Alors, quelle est la différence grep -r
et grep -R
? Un seul, en fait. Le -R
est une recherche déréférencée, ce qui signifie qu'elle suivra les liens symboliques pour accéder au fichier d'origine (qui peut se trouver dans une autre partie du système).
Jetez un oeil à la sortie du -R
rechercher dans le même exemple :

Avez-vous remarqué qu'il donne un résultat de recherche supplémentaire avec le linked.txt
qui est essentiellement un lien symbolique et a été omis de la recherche grep avec -r
option ?
Si vous n'êtes pas dans le répertoire où vous souhaitez effectuer la recherche récursive, fournissez simplement le chemin absolu ou relatif du répertoire à la commande grep :
grep -r search_term path_to_directory
Astuce bonus :exclure un certain répertoire de la recherche grep récursive
Tout semble bon mais que se passe-t-il si vous souhaitez exclure un certain répertoire de la recherche récursive ? Il y a une disposition pour cela aussi. Je vous l'ai dit, grep est une commande extrêmement polyvalente.
grep -r --exclude-dir=dir_name serach_term directory_path
Ce n'est pas ça. Vous pouvez exclure plusieurs sous-répertoires de la recherche récursive de la manière suivante :
grep -r --exclude-dir={dir1,dir2} serach_term directory_path
Voici à quoi ressemble l'exclusion des répertoires dans notre exemple :

Et oui, comme le montre l'exemple ci-dessus, l'exclusion fonctionne à la fois avec -r
et -R
options récursives.
Résumer
Voici un bref résumé de l'utilisation de la recherche grep pour plusieurs fichiers et répertoires :
Commande Grep | Description |
---|---|
chaîne grep * | Recherche dans tous les fichiers du répertoire courant |
répertoire de chaîne grep | Recherche dans tous les fichiers du répertoire dir |
grep -r chaîne . | Recherche récursive dans tous les fichiers de tous les sous-répertoires |
grep -r répertoire de chaîne | Recherche récursive dans tous les fichiers de tous les sous-répertoires de dir |
grep -R chaîne . | Identique à r mais suit les liens symboliques |
J'espère que vous aimez cette astuce grep rapide. Si vous en voulez plus, vous pouvez lire ce tutoriel détaillé sur l'utilisation de la commande grep :
Faites-moi savoir si vous avez des questions ou des suggestions sur ce sujet.