grep: как искать текст в файлах и папках рекурсивно
Чтобы найти текст во всех файлах папки, выполните grep -rn "текст" .. Ключ -r включает рекурсию, -n показывает номера строк. Вывод содержит путь к файлу, номер строки и саму строку с совпадением.
Основные ключи
Ключ | Что делает |
|---|---|
| Рекурсивный поиск по папкам |
| Показать номера строк |
| Не различать регистр |
| Искать слово целиком |
| Показать строки без совпадения |
| Посчитать строки с совпадением |
| Показать только имена файлов с совпадением |
| Показать файлы без совпадений |
| Вывести только найденную часть |
| Расширенные регулярные выражения |
| Искать как простой текст, без регулярных выражений |
Примеры
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 # строки, не начинающиеся с #Только нужные файлы
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.
Контекст вокруг найденной строки
grep -n -A 2 "Exception" app.log # плюс 2 строки после
grep -n -B 2 "Exception" app.log # плюс 2 строки до
grep -n -C 2 "Exception" app.log # по 2 строки до и послеРегулярные выражения
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 # скобки как обычные символыОбъединение с другими командами
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 # поиск в истории командБинарные и большие файлы
grep -rnI "text" . # пропускать бинарные файлы
grep -rn --binary-files=without-match "text" .Код возврата
Команда grep возвращает 0, если найдено совпадение, 1, если нет, и 2 при ошибке. Это удобно в условиях:
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.