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 (в конвейере).
grep "error" app.log
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
grep -rni "timeout" /etc
grep -E "warn|error|fatal" app.log
grep -A3 -B1 "panic" app.log
grep -c "GET" access.log
grep -rl "api_key" .
grep -rn --include='*.py' "def main" .
grep -rn --exclude-dir={.git,node_modules} "TODO" .
grep -oP '\d+\.\d+\.\d+\.\d+' access.log | sort | uniq -c | sort -rn
grep -Ff patterns.txt data.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, копипаст в терминале.
Есть неточность? Сообщить об ошибке в статье