Какие основные параметры (флаги) есть у grep?
Только начал работать в терминале и постоянно пользуюсь grep, но знаю буквально пару флагов. Подскажите, какие параметры реально пригождаются каждый день: искать без учёта регистра, рекурсивно по папке, считать совпадения и так далее? Хочется небольшую подборку с примерами.
2 ответа
Вот рабочий минимум флагов grep, которые покрывают 90% задач:
# -i — игнорировать регистр
grep -i "error" app.log # найдёт Error, ERROR, error
# -r — рекурсивно по каталогу
grep -r "TODO" ./src # ищем во всех файлах внутри src
# -n — показывать номера строк
grep -n "def " main.py
# -v — инверсия: строки БЕЗ совпадения
grep -v "#" config.conf # убрать комментарии
# -c — счётчик совпавших строк
grep -c "GET" access.log
# -l — только имена файлов, где есть совпадение
grep -rl "password" .
# -E — расширенные регулярки (grep -E == egrep)
grep -E "cat|dog" animals.txt
# -w — только целое слово
grep -w "in" text.txt # не зацепит "main", "point"
Контекст вокруг совпадения:
grep -A 2 "Exception" log.txt # +2 строки After (после)
grep -B 2 "Exception" log.txt # +2 строки Before (до)
grep -C 2 "Exception" log.txt # по 2 строки с обеих сторон
Связка с пайпом — самый частый сценарий, когда фильтруем чужой вывод:
ps aux | grep -i nginx # найти процессы nginx
history | grep "git commit" # вспомнить команду
Почему это удобно: флаги комбинируются. Например grep -rin "todo" ./src = рекурсивно + без регистра + с номерами строк за один проход. А -c и -l отлично подходят для скриптов, потому что отдают компактный машинно-читаемый результат.
Лайфхак к ответу выше: совет с ps aux | grep nginx имеет известную мелочь — сам процесс grep тоже попадает в выдачу. Чтобы убрать его, есть классический трюк со скобкой в шаблоне:
ps aux | grep "[n]ginx"
Регулярка [n]ginx означает «n, затем ginx», то есть совпадает со строкой nginx, но сама строка процесса grep содержит [n]ginx и под шаблон не подходит. Либо просто используйте pgrep nginx.