linux-labs

Вики / Базовые команды

grep (поиск по тексту)

Поиск строк по шаблону; регулярки, рекурсия, контекст.

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

grep "error" app.log              # строки со словом error
journalctl -u nginx | grep 502    # фильтр в конвейере
grep -r "TODO" src/               # рекурсивно по каталогу
Флаг Смысл
-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
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

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) — заметно быстрее.

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"           # точная строка

См. также