С чего начать Первые шаги трек · 15 ступеней
Linux Labs

grep — поиск по тексту

3 мин GNU grep

Команда grep ищет строки по шаблону в файлах и выводе команд: регулярки, рекурсия, контекст.

Шпаргалка

7 команд Версия для печати
  • grep -i word file без регистра
  • grep -rn word dir/ рекурсивно + номера строк
  • grep -v word file без слова
  • grep -C2 word file контекст ±2 строки
  • grep -rn --include='*.conf' word /etc
  • grep -oP 'regex' file только совпадение, Perl-regex
  • cmd | grep -F "literal" точная строка

Обзор

grep ищет строки, подходящие под шаблон (регулярное выражение, см. regex). Работает с файлами и со stdin (в конвейере).

bash
grep "error" app.log              # строки со словом error
journalctl -u nginx | grep 502    # фильтр в конвейере
grep -r "TODO" src/               # рекурсивно по каталогу

Ключи

17
Флаг Смысл
-i без учёта регистра
-r / -R рекурсивно по каталогам (R — идти по симлинкам)
-n показать номера строк
-v инвертировать (строки БЕЗ шаблона)
-c посчитать совпадения
-l / -L только имена файлов с совпадением / без
-w / -x слово целиком / строка целиком
-E / -F / -P extended regex / фикс. строка / Perl-regex
-A N/-B N/-C N N строк после / до / вокруг
-o только совпавшую часть
--include/--exclude фильтр имён файлов при -r
Ключ Что делает Пример
-i --ignore-case Искать без учёта регистра. grep -i word file
-r --recursive Искать рекурсивно по каталогам (-R — идти ещё и по симлинкам). grep -rn word dir/
-n --line-number Показать номера строк перед совпадениями. grep -n word file
-v --invert-match Показать строки, НЕ подходящие под шаблон. grep -v word file
-c --count Посчитать число совпадающих строк вместо их вывода. grep -c "GET" access.log
-l --files-with-matches Показать только имена файлов, где есть совпадение (-L — где нет). grep -rl "api_key" .
-w --word-regexp Искать шаблон как целое слово. grep -w word file
-E --extended-regexp Расширенные регулярные выражения (без экранирования +, ?, |, ()). grep -E "warn|error|fatal" app.log
-F --fixed-strings Искать строку буквально, без интерпретации как регулярку. grep -F "1.2.3.4" file
-P --perl-regexp Регулярки в стиле Perl (\d, \w, lookahead и т.п.). grep -oP '\d+' file
-A N Показать N строк после каждого совпадения. grep -A3 "panic" app.log
-B N Показать N строк до каждого совпадения. grep -B1 "panic" app.log
-C N Показать N строк контекста вокруг каждого совпадения. grep -C2 word file
-o --only-matching Вывести только совпавшую часть строки, а не всю строку. grep -oP 'regex' file
-x --line-regexp Совпадение должно занимать всю строку целиком. grep -x "exact line" file
--include glob При -r искать только в файлах, подходящих под маску. grep -rn --include='*.conf' word /etc
--exclude-dir glob При -r пропустить каталоги, подходящие под маску. grep -rn --exclude-dir={.git,node_modules} "TODO" .

Ничего не найдено. Попробуй запрос короче.

Рецепты

1

Примеры

bash
grep -rni "timeout" /etc                    # рекурсивно, без регистра, с номерами
grep -E "warn|error|fatal" app.log          # альтернатива (ИЛИ)
grep -A3 -B1 "panic" app.log                # контекст вокруг
grep -c "GET" access.log                     # сколько GET-запросов
grep -rl "api_key" .                         # в каких файлах встречается
grep -rn --include='*.py' "def main" .       # только .py
grep -rn --exclude-dir={.git,node_modules} "TODO" .
grep -oP '\d+\.\d+\.\d+\.\d+' access.log | sort | uniq -c | sort -rn   # топ IP (-P, -o)
grep -Ff patterns.txt data.txt               # искать любую из строк файла patterns.txt
ps aux | grep -v grep | grep nginx

Неполадки

5

grep сам попадает в вывод ps aux | grep

Классика. Исключи себя: grep -v grep, либо pgrep, либо трюк grep "[n]ginx".

Спецсимволы шаблона ловятся как регулярка

Точка, скобки, + — это regex. Экранируй или grep -F (фиксированная строка): grep -F "1.2.3.4".

\d, \w, lookahead не работают

Базовый/extended grep их не знает — нужен -P (PCRE): grep -P '\d{3}'.

Хочу совпадения, но grep молчит

Проверь регистр (-i), нужный файл, что данные реально приходят. Бинарные файлы grep может пропускать — -a (как текст).

Слишком медленно по большому дереву

Исключай каталоги (--exclude-dir), или используй ripgrep (rg) — заметно быстрее.

См. также

  • find — Поиск файлов по имени, размеру, времени, правам; действия над найденным.
  • sed-awk — Потоковое редактирование (sed) и обработка по столбцам (awk).
  • files-basics — Навигация и файлы — ls, cd, cp, mv, rm, cat, less, head, tail, копипаст в терминале.
Загрузка…