grep — что это и зачем
grep — стандартная команда Linux для поиска строк по шаблону внутри текстовых файлов и потоков. Берёт текст на вход, отдаёт строки, в которых нашлось совпадение. Базовый инструмент работы с логами, конфигами, выводом других команд через пайп.
grep
grep — стандартная команда Linux для поиска строк по шаблону внутри текстовых файлов и потоков. Берёт текст на вход, отдаёт строки, в которых нашлось совпадение. Базовый инструмент работы с логами, конфигами, выводом других команд через пайп.
Что это в одном абзаце
grep (от global regular expression print) — команда фильтрации текста. Даёшь ей шаблон и файл (или поток через пайп) — она печатает строки, в которых шаблон встретился. Это самый частый «следующий шаг» после получения вывода: что бы ни выдала команда, через | grep <что_искал> оставляешь только нужные строки.
grep "error" /var/log/syslog # строки со словом "error" в файле
grep -r "TODO" /opt/myapp # рекурсивный поиск в каталоге
ps aux | grep nginx # отфильтровать вывод ps по nginx
journalctl -u ssh | grep "Failed password" # неудачные попытки входа в SSH
Шаблон — это либо точная строка, либо регулярное выражение. По умолчанию grep работает в режиме «basic regex»; для современных регулярок добавляйте -E.
Базовые флаги
-i— без учёта регистра (case-insensitive).grep -i "error"найдёт иError, иERROR.-rили-R— рекурсивный поиск в каталоге. Часто комбинируется с именем каталога:grep -r "TODO" ..-v— инверсия: показать строки, в которых нет совпадения. Удобно для исключения шума:grep -v '^#' config.iniуберёт комментарии.-l— показать только имена файлов с совпадениями (без самих строк). Полезно для пайплайна: «дай мне все файлы, в которых упоминается X».-c— показать только количество совпадений в каждом файле.-n— показать номер строки рядом с каждым совпадением.-A 3/-B 3/-C 3— показать 3 строки после / до / вокруг совпадения. Бесценно при отладке логов.-w— искать только целые слова.grep -w "in"не найдёт строки с «information» или «during».-E— extended regex (поддержка+,?,|,()без экранирования).-F— fixed strings, точное совпадение без интерпретации регулярок. Быстрее, безопаснее для шаблонов с метасимволами.-q— quiet, ничего не выводит, нужен только код возврата. Используется вifв bash-скриптах.
Регулярные выражения в grep
Базовые элементы:
.— любой один символ.*— ноль или более повторений предыдущего символа.^— начало строки.$— конец строки.[abc]— любой из символовa,b,c.[^abc]— любой символ, кромеa,b,c.
С флагом -E добавляются:
+— одно или более повторений.?— ноль или одно.|— ИЛИ.()— группа.
Примеры:
grep "^Host " /etc/ssh/sshd_config # строки, начинающиеся с "Host "
grep "[Ee]rror" app.log # error или Error
grep -E "(error|fatal|panic)" app.log # любое из трёх слов
grep -E "[0-9]{3}-[0-9]{2}" data.csv # номер вида 123-45
grep "^[^#]" config.ini # все строки кроме комментариев
Для сложных регулярок и нескольких подстановок часто берут sed или awk — они мощнее.
Грабли grep
- Сам процесс grep попадает в результаты. Классика:
ps aux | grep nginxнайдёт и сам процесс grep. Решения:pgrep nginx(специально для процессов) или классический трюкps aux | grep '[n]ginx'(квадратные скобки делают шаблон таким, чтобы он не находил сам себя). grep -rидёт по симлинкам. Может зацикливаться на циклических симлинках. Используйтеgrep -r --no-follow, если нужно.- Бинарные файлы. Если шаблон находится в бинаре, grep пишет «Binary file matches» и не показывает контент. Чтобы пропустить бинари:
grep -I. Чтобы обработать как текст:grep -a. - Цвет. На современных дистрибутивах grep подсвечивает совпадения — это
--color=autoчерез alias. В пайпах иlessцвет ломается. Решение:grep "..." log | less -R(флаг-Rпонимает ANSI-цвета). - Регулярка не та, что вы ожидали. В basic regex
+и?— это литералы, а не кванторы. Если регулярка не работает — добавьте-E.
Альтернативы grep
ripgrep(rg) — быстрый аналогgrep -rс человеческим UX и красивым выводом. Игнорирует.gitignoreпо умолчанию. Установить:sudo apt install ripgrep.ag(the_silver_searcher) — предшественник ripgrep, тоже быстрый. Сейчас вытесняется ripgrep-ом.ack— Perl-альтернатива, заточенная под код.
В скриптах автоматизации остаётся grep — он стандартен. Для интерактивного поиска по проекту чаще берут rg.
grep в bash-скриптах
grep -q отлично работает в условиях:
if grep -q "MemTotal:" /proc/meminfo; then
echo "Линукс с /proc"
fi
if ! grep -q "myhost" /etc/hosts; then
echo "Запись отсутствует, добавляем..."
echo "10.0.0.5 myhost" | sudo tee -a /etc/hosts
fi
Подробнее про условные конструкции — bash if/else.
Частые вопросы
Что такое grep в Linux
Команда поиска строк по шаблону внутри файлов или потоков. Универсальный фильтр: что бы ни вывела другая команда, | grep <шаблон> оставит только строки с совпадением. Расшифровка названия — Global Regular Expression Print.
Как искать без учёта регистра в grep
Флаг -i (insensitive). grep -i "error" log.txt найдёт строки с error, Error, ERROR — в любом регистре. Иногда удобно вместе с -w (только целые слова): grep -iw "error" не найдёт «errorless».
Как искать рекурсивно по всем файлам
grep -r "шаблон" /путь/к/каталогу. Для пропуска бинарных файлов добавьте -I. Чтобы вывести только имена файлов с совпадениями — -l. Современная альтернатива — ripgrep (rg "шаблон" /путь), он быстрее и по умолчанию уважает .gitignore.
Чем grep отличается от find
grep ищет по содержимому файла (текст внутри). find ищет по атрибутам файла (имя, тип, размер, дата). Часто используют вместе: find . -name "*.log" -exec grep -l "error" {} + — найдёт .log-файлы, в которых есть «error».
Почему grep в ps aux находит сам себя
Потому что в момент вашего поиска grep тоже работает как процесс с командной строкой grep nginx. Он попадает в вывод ps, а потом сам же находит себя. Решения: pgrep nginx (специальная команда для поиска процессов) или классический трюк grep '[n]ginx' — символ в скобках не совпадает с самим шаблоном «[n]ginx», но совпадает с «nginx».
Что значит grep -v
Инверсия: показать строки, в которых шаблон не найден. Часто используется для удаления мусора: grep -v '^#' config.ini показывает все строки кроме комментариев. Можно цеплять: cat log | grep -v 'INFO' | grep -v 'DEBUG' — оставит только не-INFO и не-DEBUG.
Что почитать
- find — родственная команда: find ищет файлы по атрибутам, grep — содержимое внутри файлов. Часто работают в паре.
- bash if/else —
grep -q— стандартный паттерн для условий: «если в файле есть строка X — сделать Y». - chmod —
find ... -exec grep -l ... {} + | xargs chmod— стандартный пайплайн массовой обработки файлов.