grep
Утилита Unix для поиска строк по шаблону в файлах и потоках — главный инструмент разбора логов.
Что такое grep
grep — консольная утилита, которая ищет строки, подходящие под шаблон, и печатает их. Работает с файлами и с потоком, пришедшим по конвейеру. Это самый частый инструмент админа: разбор логов почти всегда начинается с grep.
Название — не аббревиатура в привычном смысле, а команда из старого редактора ed: g/re/p, то есть globally search for a regular expression and print. Так и запомнилось.
grep "error" /var/log/nginx/error.log # строки со словом error
grep -i "timeout" app.log # без учёта регистра
journalctl -u myapp | grep -i "failed" # поиск в потоке
Ключи, которые решают почти всё
| Ключ | Что делает |
|---|---|
-i |
игнорировать регистр |
-v |
инвертировать: показать строки БЕЗ совпадения |
-r |
рекурсивно по всем файлам в каталоге |
-n |
печатать номера строк |
-c |
только количество совпадений |
-l |
только имена файлов, где есть совпадение |
-w |
искать слово целиком |
-E |
расширенные регулярные выражения |
-F |
искать как обычный текст, без регулярок (и быстрее) |
-A 3 / -B 3 / -C 3 |
показать 3 строки после / до / вокруг совпадения |
Реальные задачи
# ошибки с контекстом в три строки вокруг — видно, что привело к падению
grep -C 3 -i "traceback" /var/log/myapp/app.log
# 500-е ответы в логе nginx за сегодня
grep " 500 " /var/log/nginx/access.log | grep "$(date +%d/%b/%Y)"
# найти, где в проекте забыли захардкоженный пароль
grep -rn --include="*.py" -E "password\s*=\s*['\"]" /srv/myapp
# конфиг без комментариев и пустых строк — читать в разы приятнее
grep -vE "^\s*(#|$)" /etc/nginx/nginx.conf
# сколько раз OOM killer убивал процессы
dmesg | grep -ci "killed process"
Приём с -v из предпоследнего примера стоит запомнить отдельно: конфиг Nginx или sshd на 200 строк превращается в 20 строк реальных настроек.
Регулярные выражения
По умолчанию grep понимает базовые регулярки, где +, ?, | и скобки надо экранировать. Ключ -E включает расширенный синтаксис — привычный по любому языку программирования:
grep -E "^(GET|POST) /api/v[12]/" access.log
grep -E "[0-9]{1,3}(\.[0-9]{1,3}){3}" app.log # похожее на IP-адрес
Если шаблон ищется как обычный текст, а не как регулярка, ставьте -F: grep -F "1.2.3.4" не будет трактовать точки как «любой символ» и отработает быстрее.
Когда grep не подходит
- Данные структурированы — для JSON берите
jq, для колонокawk: grep не знает про поля и вложенность - Огромное дерево кода —
ripgrep(rg) заметно быстрее, уважает.gitignoreи по умолчанию рекурсивен - Ищете в бинарниках — grep пропустит их или испортит вывод; спасают ключи
-aи--binary-files=text - Windows — там встроенный аналог называется
findstr, в PowerShell —Select-String
Связанные термины
- Регулярные выражения — язык шаблонов, на котором работает grep
- Bash — оболочка и конвейеры, где живёт grep
- Утилиты Linux — соседи по инструментарию: sed, awk, find
- CLI — интерфейс, в котором всё это работает
- Linux — родная среда утилиты
Готовы запустить GPU-задачу?
Запустить GPU-сервер