# grep - поиск строк по шаблону _Команды · LinuxLab Knowledge Base_ **TL;DR:** `grep` ищет строки по regex'у в stdin или файлах. Главные режимы: `-E` (ERE), `-P` (PCRE), `-F` (фиксированная строка), `-r` (рекурсивно по дереву). ## Базовый синтаксис ``` grep [OPTIONS] PATTERN [FILE...] ``` По умолчанию `grep` использует **BRE** (Basic Regular Expressions) - это значит что `+`, `?`, `(`, `)`, `{`, `}` в шаблоне трактуются как литералы, если не экранированы. Чтобы получить «обычные» regex'ы - используй `-E` (или `egrep`, который то же самое): ```bash grep 'foo\+' file # BRE: + надо экранировать grep -E 'foo+' file # ERE: уже не надо ``` ## Главные флаги | флаг | значение | |---|---| | `-i` | без учёта регистра | | `-v` | инвертировать (строки БЕЗ совпадения) | | `-n` | с номерами строк | | `-c` | только количество совпадений | | `-l` | только имена файлов где есть совпадение | | `-L` | наоборот - файлы где НЕТ совпадения | | `-o` | печатать только совпавшую часть | | `-w` | целое слово | | `-x` | целая строка | | `-r` / `-R` | рекурсивно по дереву (R резолвит symlink'и) | | `-A N` / `-B N` / `-C N` | контекст: After / Before / Around | | `--include='*.py'` | только эти файлы при `-r` | | `--exclude-dir=.git` | пропускать каталог | ## Режимы regex ```bash grep -F 'a.b.c' file # -F: фиксированная строка, точки - это точки grep 'a.b' file # BRE: . = любой символ grep -E '^[0-9]+$' file # ERE: [], +, {}, () работают без \ grep -P '\d{3}-\d{4}' file # PCRE: \d, \w, look-ahead, named groups ``` PCRE даёт самые мощные шаблоны (lookahead, non-greedy, character classes как в Perl), но требует чтобы `grep` был собран с `--enable-perl-regexp` (на Ubuntu из коробки - да). ## Рекурсивный поиск ```bash grep -rn 'TODO' . # все TODO в проекте, с номерами grep -rni --include='*.py' 'fixme' src/ # только в .py файлах grep -rln 'API_KEY' /etc # имена файлов с упоминанием grep -rn 'password' . --exclude-dir=.git --exclude-dir=node_modules ``` Без `-r` `grep` будет жаловаться: `Is a directory`. ## Контекст ```bash grep -n -B 2 -A 2 'ERROR' app.log # 2 строки до и после grep -C 3 'panic' /var/log/syslog # ±3 строки вокруг ``` ## Якоря и группы ```bash grep '^Host' ~/.ssh/config # начало строки grep '\.log$' filelist # конец строки grep -E '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b' file # IPv4 (см. [ipv4-addressing](/kb/ipv4-addressing.md)) grep -Eo '[a-z0-9.]+@[a-z0-9.]+' # извлечь email-адреса ``` ## Связка с другими инструментами Самая частая - pipe из [cmd-find](/kb/cmd-find.md): ```bash find . -type f -name '*.conf' -print0 | xargs -0 grep -l 'listen 80' # → найти все конф-файлы где упомянут "listen 80" ``` Или из вывода другой команды: ```bash ps aux | grep -v grep | grep nginx # классика «без самой grep-строки» ss -tn | grep ESTAB # ESTABLISHED-сессии dmesg | grep -i 'oom' # см. [oom-killer](/kb/oom-killer.md) ``` Идиома `| grep -v grep` нужна потому что сам `ps aux | grep nginx` находит собственный процесс grep'а в выводе ps. ## Exit codes (важно для скриптов) - `0` - было хоть одно совпадение - `1` - совпадений не нашлось - `2` - ошибка (нет файла, плохой regex) Поэтому в bash: ```bash if grep -q ERROR app.log; then echo "errors present" fi ``` `-q` (quiet) не выводит ничего, только ставит exit code. ## ripgrep как современная альтернатива `rg` (ripgrep) на порядки быстрее `grep -r`: автоматически уважает `.gitignore`, параллелит, использует SIMD. На больших репах разница драматическая. Но `grep` - POSIX и есть везде, поэтому база нужна. ## Команды ```bash grep -rn 'TODO' . ``` Все TODO в проекте, рекурсивно, с номерами строк ```bash grep -i error /var/log/syslog | tail ``` Последние строки с error/Error/ERROR (без учёта регистра) ```bash grep -c '^GET' access.log ``` Сколько GET-запросов в логе (только счётчик, не строки) ```bash grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' access.log ``` Строки начинающиеся с IPv4-адреса (ERE - без бэкслешей) ```bash grep -rln --include='*.py' 'import requests' . ``` Имена .py-файлов где импортируется requests ```bash grep -B 2 -A 5 'panic' /var/log/kern.log ``` Контекст вокруг паники: 2 до, 5 после ## См. также - [find - поиск файлов по предикатам](/kb/cmd-find.md) - [sed - потоковый редактор текста](/kb/cmd-sed.md) - [awk - обработка структурированного текста по полям](/kb/cmd-awk.md) - [jq - запросы и трансформация JSON](/kb/cmd-jq.md) - [File permissions: rwx и chmod](/kb/file-permissions.md)