Rechercher du texte dans des fichiers sous Linux
Rechercher du texte dans des fichiers sous Linux : grep, jokers et dédoublonnage
Sous Linux, find sert à localiser des fichiers, tandis que grep sert à chercher dans leur contenu. Pour rechercher une chaîne comme borg1.sh, borg-hhhh.sh ou borg_backup.sh dans tous les fichiers Markdown, la commande la plus pratique est :
1
grep -rn --include='*.md' 'borg[^/[:space:]]*\.sh' .
find ou grep ?
| Besoin | Commande | Exemple |
|---|---|---|
| Trouver des fichiers par nom | find |
find . -name '*.md' |
| Chercher dans le contenu | grep |
grep 'motif' fichier.md |
| Chercher dans une arborescence | grep -r |
grep -r 'motif' . |
| Restreindre à une extension | grep --include |
grep -r --include='*.md' 'motif' . |
find recherche selon le nom, le type, la taille ou la date ; grep examine le texte contenu dans les fichiers.[alexhost]
Les deux sortes de jokers
Il faut distinguer deux mécanismes :
- Jokers de noms de fichiers :
*.md,borg*.sh,?.txt. Ils sélectionnent les fichiers. - Expressions régulières : utilisées par
greppour chercher dans le contenu.
Par exemple, dans --include='*.md', l’astérisque * est un joker de nom de fichier. En revanche, dans le motif de recherche, * a une signification différente : il répète le caractère précédent.[tutorialspoint][d3s.mff.cuni]
Rechercher borg*.sh dans les .md
La commande recommandée est :
1
grep -rn --include='*.md' 'borg[^/[:space:]]*\.sh' .
Elle signifie :
-r: recherche récursive dans le dossier courant et ses sous-dossiers.-n: affiche le numéro de ligne.--include='*.md': ne cherche que dans les fichiers Markdown.borg: cherche le texte littéralborg.[^/[:space:]]*: accepte zéro ou plusieurs caractères, sauf/et les espaces.\.: cherche un vrai point, et non n’importe quel caractère..final : répertoire courant.
Elle trouvera donc borg1.sh, borg-hhhh.sh, borg_backup.sh, etc.[developers.redhat][d3s.mff.cuni]
Afficher seulement la première occurrence
Pour limiter le résultat à une occurrence par fichier :
1
grep -rn -m 1 --include='*.md' 'borg[^/[:space:]]*\.sh' .
L’option -m 1 demande à grep de s’arrêter après la première correspondance dans chaque fichier.[d3s.mff.cuni]
Pour supprimer les lignes strictement identiques dans l’ensemble des résultats :
1
grep -rn --include='*.md' 'borg[^/[:space:]]*\.sh' . | sort -u
Pour conserver la première apparition de chaque ligne, sans trier :
1
grep -rn --include='*.md' 'borg[^/[:space:]]*\.sh' . | awk '!seen[$0]++'
Variantes utiles
Lister uniquement les fichiers contenant le motif :
1
grep -rl --include='*.md' 'borg[^/[:space:]]*\.sh' .
Exclure le dossier .git :
1
grep -rn --include='*.md' --exclude-dir='.git' 'borg[^/[:space:]]*\.sh' .
Recherche insensible à la casse :
1
grep -rni --include='*.md' 'borg[^/[:space:]]*\.sh' .
Recherche avec find, utile pour filtrer d’abord les fichiers :
1
find . -type f -name '*.md' -print0 | xargs -0 grep -nE 'borg[-[:alnum:]]*\.sh'
À retenir
findtrouve des fichiers ;grepcherche dans leur contenu.- Mettez les motifs entre guillemets simples pour éviter leur interprétation par le shell.
--include='*.md'filtre les fichiers ; il ne définit pas le motif recherché.- Dans une regex
grep, échappez le point : écrivez\.sh, pas.sh. - Utilisez
-m 1pour une occurrence par fichier,sort -upour supprimer les doublons exacts, ouawk '!seen[$0]++'pour garder la première ligne unique.[developers.redhat][d3s.mff.cuni][learn.microsoft]