Linux & Administration

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, в PowerShellSelect-String

Связанные термины

  • Регулярные выражения — язык шаблонов, на котором работает grep
  • Bash — оболочка и конвейеры, где живёт grep
  • Утилиты Linux — соседи по инструментарию: sed, awk, find
  • CLI — интерфейс, в котором всё это работает
  • Linux — родная среда утилиты

Готовы запустить GPU-задачу?

Запустить GPU-сервер