Aller au contenu

grep

La commande grep permet de rechercher une chaîne de caractères dans un fichier.

macOS intègre la version BSD de grep

$ grep -V
grep (BSD grep) 2.5.1-FreeBSD
mais peut aussi utiliser la version GNU grâce à Homebrew (rebaptiser ggrep)
$ ggrep -V
ggrep (GNU grep) 3.6
Packaged by Homebrew

Options (toutes les options)(US):

-E, --extended-regexp interprète la PATTERN comme Expression Régulière Etendue
-F, --fixed-strings interprète la PATTERN comme chaine
-G, --basic-regexp interprète la PATTERN comme chaine Expression Régulière Basique
-P, --perl-regexp interprète la PATTERN comme Expression Régulière PERL (PCRE)
-i, --ignore-case insensible à la casse
-v affiche les lignes ne contenant pas la chaîne
-w, --word-regexp recherche le mot correspondant exactement à la chaîne
-x, --line-regexp recherche ligne correspondant exactement à la chaîne
-c, --count compte le nombre de lignes contenant le fichier / chaîne (associé à -v)
--color (never|always|auto) met en couleur les concordances
-l, --files-with-matches affiche le nom des fichiers qui contiennent la chaîne
-m NUM, --max-count NUM stoppe la lecture du fichier après avoir trouvé NUM lignes
-n, --line-number chaque ligne contenant la chaîne est numérotée
-C NUM, --context=NUM fait figurer les NUM lignes qui précèdent et suivent la ligne  figure le mot recherché
-A NUM, --after-context=NUM affiche les NUM lignes qui suivent la ligne  figure le mot recherché
-B NUM, --before-context=NUM affiche les NUM lignes qui précèdent la ligne  figure le mot recherché
-r (recursif)

Chercher dans un dossier (récursif):

grep -r "brew" ./docs/
./docs//Divers/plex.md:   $ brew install mono

# N'affiche que les fichiers (-l):
grep -l -r "brew" ./docs/
./docs//Divers/plex.md
./docs//macos/node-js.md

root@localhost:/etc# grep -r 'max_allowed_packet' ./mysql/
./mysql/conf.d/mysqldump.cnf:max_allowed_packet = 16M
./mysql/mariadb.conf.d/50-server.cnf:max_allowed_packet = 16M

Chercher dans tous les fichiers 'php' ou 'html' (et ignorer les dossiers '.git'):

grep pattern $(find . -name '*.php' -or -name '*.html' | grep -v .git)

Regex:

grep -E ^a toto.txt

L'option -E est optionnelle (compatibilité).

Caractère spécial Signification
. Caractère quelconque
^ Début de ligne
$ Fin de ligne
[] Un des caractères entre les crochets
? L'élément précédent est optionnel (peut être présent 0 ou 1 fois)
* L'élément précédent peut être présent 0, 1 ou plusieurs fois
+ L'élément précédent doit être présent 1 ou plusieurs fois
| Ou
() Groupement d'expressions

Lignes commençant par les caractères compris entre a et d:

grep ^[a-d] fichier.txt

Lignes ne commençant pas # ou ;

grep "^[^#;]" smb.conf

Rechercher plusieurs chaines:

grep -E 'alias|function' ~/.zshrc
grep -e alias -e function ~/.zshrc

ou passer un fichier de motifs à grep:

cat motif.txt

grep -f "motif.txt" fichier.txt

Afficher les 5 lignes qui suivent le motif recherché:

grep 'toto' -A5 fichier.txt

Dernière mise à jour: July 25, 2021