linux streams

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 в условных выражениях скриптов.

Синтаксис

grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] -e PATTERN ... [FILE...] grep [OPTIONS] -f FILE ... [FILE...]
# Базовый поиск grep "error" /var/log/syslog # Поиск без учёта регистра grep -i "Error" app.log # Рекурсивный поиск в директории grep -r "TODO" ./src/ # Использование расширенных regex grep -E "^[0-9]{3}-[0-9]{4}$" phones.txt

Флаги и опции

Флаг Описание Пример
-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 для постоянной подсветки совпадений.
Внимание: В базовых regex (BRE) символы +, ?, |, () нужно экранировать backslash. Используйте -E для привычного синтаксиса.
Внимание: Рекурсивный поиск grep -r по большой директории может быть медленным. Для поиска в коде используйте специализированные утилиты: ag (silver searcher) или rg (ripgrep) — они значительно быстрее.