grep: как искать текст в файлах и папках рекурсивно

Категория: Bash · Язык: Bash · Обновлено:

Чтобы найти текст во всех файлах папки, выполните grep -rn "текст" .. Ключ -r включает рекурсию, -n показывает номера строк. Вывод содержит путь к файлу, номер строки и саму строку с совпадением.

Основные ключи

Ключ

Что делает

-r

Рекурсивный поиск по папкам

-n

Показать номера строк

-i

Не различать регистр

-w

Искать слово целиком

-v

Показать строки без совпадения

-c

Посчитать строки с совпадением

-l

Показать только имена файлов с совпадением

-L

Показать файлы без совпадений

-o

Вывести только найденную часть

-E

Расширенные регулярные выражения

-F

Искать как простой текст, без регулярных выражений

Примеры

Bash
grep -rn "TODO" src/                   # все TODO с номерами строк
grep -rni "error" /var/log/myapp       # без учёта регистра
grep -rl "api_key" .                   # только имена файлов
grep -rc "import" src/ | grep -v ":0"  # число совпадений по файлам, без нулевых
grep -w "port" config.ini              # слово «port», но не «export»
grep -v "^#" config.ini                # строки, не начинающиеся с #

Только нужные файлы

Bash
grep -rn --include="*.py" "def main" .
grep -rn --exclude="*.min.js" "jQuery" static/
grep -rn --exclude-dir={node_modules,.git,vendor} "fetchData" .

Ключ --include ограничивает поиск по маске файлов, --exclude и --exclude-dir исключают лишнее. Фигурные скобки перечисляют несколько папок: это возможность оболочки Bash.

Контекст вокруг найденной строки

Bash
grep -n -A 2 "Exception" app.log       # плюс 2 строки после
grep -n -B 2 "Exception" app.log       # плюс 2 строки до
grep -n -C 2 "Exception" app.log       # по 2 строки до и после

Регулярные выражения

Bash
grep -E "error|warning" app.log                         # или
grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}" app.log           # строки, начинающиеся с даты
grep -oE "[0-9]{1,3}(\.[0-9]{1,3}){3}" access.log       # выбрать только IP-адреса
grep -F "price (rub)" prices.txt                        # скобки как обычные символы

Объединение с другими командами

Bash
ps aux | grep nginx | grep -v grep                      # процессы nginx без самого grep
grep -rl "old_name" . | xargs sed -i 's/old_name/new_name/g'    # массовая замена
history | grep ssh                                      # поиск в истории команд

Бинарные и большие файлы

Bash
grep -rnI "text" .                     # пропускать бинарные файлы
grep -rn --binary-files=without-match "text" .

Код возврата

Команда grep возвращает 0, если найдено совпадение, 1, если нет, и 2 при ошибке. Это удобно в условиях:

Bash
if grep -q "enabled=true" config.ini; then
  echo "включено"
fi

Ключ -q отключает вывод и оставляет только код возврата.

Частые вопросы

Почему grep -r находит совпадения в .git или node_modules?

Рекурсивный поиск обходит все папки. Исключите их через --exclude-dir. Для кода удобнее git grep, он ищет только в отслеживаемых файлах и работает быстрее.

Как искать по нескольким словам, чтобы все были в файле?

grep -l "слово1" *.txt | xargs grep -l "слово2" оставит файлы, где есть оба слова.

Чем grep -E отличается от egrep?

Ничего: egrep это устаревший псевдоним для grep -E.