# grep La commande **grep** permet de rechercher une chaîne de caractères dans un fichier. macOS intègre la version BSD de grep ```bash $ grep -V grep (BSD grep) 2.5.1-FreeBSD ``` mais peut aussi utiliser la version GNU grâce à Homebrew (rebaptiser ggrep) ```bash $ ggrep -V ggrep (GNU grep) 3.6 Packaged by Homebrew ``` Options ([toutes les options](grep-options-fr.md))([US](grep-options.md)): ```bash -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) ``` ```bash -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 ``` ```bash -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 ``` ```bash -n, --line-number chaque ligne contenant la chaîne est numérotée ``` ```bash -C NUM, --context=NUM fait figurer les NUM lignes qui précèdent et suivent la ligne où figure le mot recherché -A NUM, --after-context=NUM affiche les NUM lignes qui suivent la ligne où figure le mot recherché -B NUM, --before-context=NUM affiche les NUM lignes qui précèdent la ligne où figure le mot recherché -r (recursif) ``` ```bash ``` Chercher dans un dossier (récursif): ```bash 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'): ```bash grep pattern $(find . -name '*.php' -or -name '*.html' | grep -v .git) ``` Regex: ```bash 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: ```bash grep ^[a-d] fichier.txt ``` Lignes ne commençant pas # ou ; ```bash grep "^[^#;]" smb.conf ``` Rechercher plusieurs chaines: ```bash grep -E 'alias|function' ~/.zshrc ``` ```bash grep -e alias -e function ~/.zshrc ``` ou passer un fichier de motifs à grep: ```bash cat motif.txt grep -f "motif.txt" fichier.txt ``` Afficher les 5 lignes qui suivent le motif recherché: ```bash grep 'toto' -A5 fichier.txt ``` Afficher les 5 lignes qui précèdent le motif recherché: ```bash grep 'toto' -B5 fichier.txt ```