Aller au contenu

grep

À quoi il sert

grep, apparu dans Unix en 1973, lit des lignes et n'écrit que celles qui correspondent à un motif. Le motif est une expression régulière basique par défaut, étendue avec -E, une chaîne fixe avec -F, ou une expression compatible Perl avec -P (extension GNU, par PCRE2). Les options choisissent ce que l'on veut obtenir : les lignes (par défaut), leur nombre (-c), les seules correspondances (-o), les noms des fichiers (-l, -L), ou rien du tout et un code de sortie (-q) : 0 si une ligne correspond, 1 si aucune, 2 en cas d'erreur. Il sait aussi afficher le contexte (-A, -B, -C), parcourir une arborescence (-r, avec --include et --exclude), lire ses motifs dans un fichier (-f) et des enregistrements séparés par l'octet nul (-z). Ubuntu 24.04 et Debian 13 fournissent GNU grep 3.11 ; la dernière version publiée par GNU est la 3.12 (avril 2025).

Quand le choisir

Pour trouver : isoler les lignes d'un journal, vérifier qu'un fichier contient une valeur dans un if, lister les fichiers qui mentionnent un terme. GNU grep compile ses motifs en automate fini et cherche les chaînes fixes par des algorithmes de saut : il est le plus rapide des outils de cette famille pour cette tâche. Dès qu'il faut transformer la ligne, passez à sed ; découper et calculer, à awk ; interroger du JSON, à jq. Pour fouiller du code source dans un dépôt, ripgrep (rg, 14.1 sur Debian 13) respecte .gitignore et parallélise, mais n'est pas installé sur un serveur.

Points d'attention

  • Code 1 n'est pas une erreur : sous set -e ou pipefail, un grep qui ne trouve rien arrête le script. Écrivez grep ... || true ou testez explicitement le code.
  • grep -c compte des lignes, pas des occurrences ; grep -o ... | wc -l compte les correspondances.
  • grep 500 trouve aussi 1500 et 5000 : encadrez le motif (-w, -x, ancres, délimiteurs).
  • Protégez le motif par des guillemets simples, et utilisez -e ou -- s'il peut commencer par un tiret. Un motif venu d'un tiers se passe avec -F pour être pris littéralement.
  • \d n'existe qu'avec -P ; en BRE et ERE, écrivez [0-9]. Debian et Ubuntu désactivent par un correctif les avertissements d'obsolescence d'egrep et fgrep et ceux des barres obliques inverses superflues, ajoutés par grep 3.8 en amont : un script qui passe en silence ici peut avertir ailleurs. Préférez grep -E et grep -F.
  • grep -P fonctionne par retour arrière : un motif mal écrit face à des données hostiles expose au ReDoS.
  • Un octet nul ou un encodage invalide fait classer le fichier comme binaire (binary file matches) ; -a force la lecture comme texte, et LC_ALL=C accélère nettement les recherches.

Par où commencer

La leçon grep et les expressions régulières du cours Traiter du texte, qui mène l'enquête sur l'incident de Signalements, et la leçon Lire et éditer des fichiers de Linux : premiers pas pour les premières options. Puis le manuel de GNU grep et le chapitre sur les expressions régulières de POSIX.