grep и regex
Тема дорожной карты · Bash
grep — основная Linux-команда для поиска текста с использованием регулярных выражений; в Bash-скриптах она используется для фильтрации строк из файлов или вывода команд с помощью шаблонов вроде grep -E '^ERROR' app.log или grep -v '^#' config.conf для исключения комментариев. Флаг -E включает расширенные регулярные выражения (ERE) в grep с поддержкой +, ?, | и квантификаторов {n,m}; -P включает Perl-совместимые регулярные выражения (PCRE) с поддержкой опережения и ретроспекции; а -F трактует шаблон как литеральную фиксированную строку для быстрого поиска в скриптах автоматизации Linux. grep органично интегрируется с конвейерами Bash — ps aux | grep -v grep | grep nginx фильтрует список процессов, а grep -r 'TODO' src/ рекурсивно ищет в деревьях исходного кода, — и его код завершения (0 при совпадении, 1 при его отсутствии) позволяет использовать его непосредственно в операторах if. Регулярные выражения в grep — ключевая компетенция для написания shell-скриптов, анализа журналов и обработки текста в командной строке Linux, наряду с sed 's/old/new/' и awk '{print $1}'. Каждый инженер по автоматизации Bash должен знать grep -c (подсчёт совпадений), grep -l (список совпадающих файлов), grep -n (показ номеров строк) и grep -o (вывод только совпавшей части) для эффективной обработки текста в скриптах.
Как это работает
grep и regex использует unix-pipeline-инструменты: grep (regex-поиск), sed (stream-edit), awk (record-oriented), cut (column slice), tr (трансляция), sort, uniq, head, tail, wc, xargs. Композируйте пайпами. Пример: cat access.log | grep " 500 " | awk '{print $7}' | sort | uniq -c | sort -rn | head отвечает на "какие URL чаще всего 500".
Когда применять
Эти инструменты — для анализа логов, CSV-munging, быстрых агрегаций. awk — когда записи имеют поля. sed -i — для in-place правки (с backup sed -i.bak). grep -E (extended regex) или grep -P (PCRE) — когда нужно больше базового regex. Для повторяющихся задач оформите в скрипт + shellcheck.
Типичные ошибки
Ловушки grep и regex: sed -i "" различается между GNU sed (Linux) и BSD sed (macOS); жадный regex матчит больше ожидаемого; locale-зависимый sort (ставьте LC_ALL=C для byte-order в скриптах); UUOC ("useless use of cat" — grep pat file вместо cat file | grep pat).