Rechercher du texte dans des fichiers sous Linux

Rechercher du texte dans des fichiers sous Linux

Notes › Linux cli scripts

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 grep pour 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éral borg.
  • [^/[: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

  • find trouve des fichiers ; grep cherche 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 1 pour une occurrence par fichier, sort -u pour supprimer les doublons exacts, ou awk '!seen[$0]++' pour garder la première ligne unique.[developers.redhat][d3s.mff.cuni][learn.microsoft]

Tags tendance