grep
Поиск строк, соответствующих шаблону (регулярному выражению)
Описание
grep (Global Regular Expression Print) — утилита для поиска строк в файлах или стандартном вводе, соответствующих заданному шаблону. Создана Кеном Томпсоном в 1973 году для первых версий Unix и с тех пор стала одним из самых используемых инструментов командной строки. Название происходит от команды редактора ed: g/re/p — «глобально найти регулярное выражение и вывести».
grep поддерживает три режима регулярных выражений: базовые (BRE, по умолчанию), расширенные (ERE, флаг -E) и Perl-совместимые (PCRE, флаг -P). Расширенный режим egrep и фиксированный режим fgrep (поиск без regex) сейчас являются алиасами grep -E и grep -F.
Команда незаменима при анализе логов, поиске в кодовой базе, фильтрации вывода других команд через пайп. Возвращает код завершения 0 если найдено совпадение, 1 если нет, 2 при ошибке — это позволяет использовать grep в условных выражениях скриптов.
Синтаксис
- PATTERN — регулярное выражение (BRE по умолчанию)
- [FILE...] — файлы для поиска; без файла читает stdin
- -e PATTERN — явное указание шаблона (можно несколько)
- -f FILE — шаблоны из файла (по одному на строку)
Флаги и опции
| Флаг | Описание | Пример |
|---|---|---|
-i |
Игнорировать регистр при сравнении | grep -i "error" log.txt |
-v |
Инвертировать: вывести строки, НЕ содержащие шаблон | grep -v "#" config.ini |
-r / -R |
Рекурсивный поиск по директории (-R следует по симлинкам) |
grep -r "import" ./src/ |
-n |
Вывести номер строки перед каждым совпадением | grep -n "def " main.py |
-l |
Вывести только имена файлов с совпадениями | grep -rl "TODO" ./ |
-c |
Вывести только количество совпадающих строк | grep -c "error" app.log |
-E |
Расширенные регулярные выражения (ERE) | grep -E "foo|bar" file.txt |
-F |
Фиксированные строки (без regex, быстрее) | grep -F "192.168.1.1" log |
-P |
Perl-совместимые регулярные выражения (PCRE) | grep -P "\d{4}" file.txt |
-A N |
Вывести N строк ПОСЛЕ совпадения (after) | grep -A 3 "ERROR" log |
-B N |
Вывести N строк ДО совпадения (before) | grep -B 2 "FATAL" log |
-C N |
Вывести N строк до и после совпадения (context) | grep -C 2 "Exception" log |
-w |
Совпадение только с целым словом | grep -w "log" file.txt |
-x |
Совпадение только с целой строкой | grep -x "exact line" file |
--color |
Подсветить совпадения цветом | grep --color "error" log |
Паттерны использования
Поиск ошибок в логах
grep -i "error\|warning\|fatal" /var/log/syslog grep -E "ERROR|WARN|FATAL" app.log | tail -20 grep -c "ERROR" app.log # сколько ошибок
Поиск в коде
# Найти все TODO в Python-файлах grep -rn "TODO\|FIXME" --include="*.py" ./ # Найти определения функций grep -n "^def " *.py
Фильтрация вывода
ps aux | grep "nginx" cat /etc/passwd | grep -v "^#" ls -la | grep "^d" # только директории
Контекст вокруг совпадения
# 3 строки до и после ошибки grep -C 3 "Traceback" error.log # 5 строк после совпадения grep -A 5 "Exception:" app.log
Несколько шаблонов
grep -e "error" -e "warning" log.txt grep -E "error|warning|fatal" log.txt grep -f patterns.txt log.txt
Поиск IP-адресов
grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" log
grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log | sort -u
Советы и предупреждения
-r, --include и --exclude для точного поиска в больших проектах:
grep -r "pattern" --include="*.py" --exclude-dir=".git" ./
-o выводит только совпавшую часть строки (не всю строку) — удобно для извлечения данных:
grep -oP "(?<=user=)\w+" access.log
alias grep='grep --color=auto' в ~/.bashrc для постоянной подсветки совпадений.
+, ?, |, () нужно экранировать backslash. Используйте -E для привычного синтаксиса.
grep -r по большой директории может быть медленным. Для поиска в коде используйте специализированные утилиты: ag (silver searcher) или rg (ripgrep) — они значительно быстрее.