grep: поиск по тексту

Находим нужные строки в файлах и потоках данных.

grep — это команда, которая выводит строки, совпадающие с заданным шаблоном или регулярным выражением.

Базовый поиск

grep печатает строки, содержащие искомый текст. Можно искать в файле или в потоке из пайпа.

grep "ERROR" app.log
cat app.log | grep "timeout"

Первая команда читает файл сама, вторая принимает поток. Результат — только строки с совпадением.

Полезные флаги

ФлагЧто делает
-iигнорировать регистр
-vинвертировать: строки БЕЗ совпадения
-nпоказывать номера строк
-cтолько число совпадений
-rрекурсивно по папке
grep -in "error" app.log
grep -c "200" access.log
grep -rn "TODO" ./src

Вывод:

14:Connection error
27:Fatal error in handler
1523
./src/main.sh:42:# TODO: добавить проверку

-in нашёл «error» в любом регистре с номерами строк, -c посчитал строки с «200», -rn обошёл всю папку.

Регулярные выражения

Шаблон grep — это регулярное выражение, а не просто текст. Включить расширенный синтаксис помогает -E.

grep -E "^[0-9]+" data.txt
grep -E "cat|dog" animals.txt

Первая строка ищет строки, начинающиеся с цифр (^ — начало строки, [0-9]+ — одна и более цифр), вторая — строки со словом cat ИЛИ dog.

Как работает под капотом

grep читает вход построчно и для каждой строки проверяет совпадение с шаблоном, печатая подошедшие. Без -E он использует «базовые» регулярные выражения (BRE), где + и | нужно экранировать; с -E — «расширенные» (ERE), где они работают напрямую. Это потоковый инструмент: он не держит весь файл в памяти, поэтому одинаково быстр и на маленьком, и на огромном логе.

Частые ошибки

  • Спецсимволы regex без экранирования. Точка . в шаблоне значит «любой символ»; чтобы искать буквальную точку, пишите \. или используйте grep -F (поиск как простого текста).
  • Забыть -E для | и +. Без него в базовом режиме они трактуются буквально.
  • grep по бинарным файлам. Может выдать мусор; добавляйте -I, чтобы пропускать бинарники.

Итог

  • grep шаблон файл печатает совпавшие строки; работает и с пайпом.
  • Флаги: -i (регистр), -v (инверсия), -n (номера), -c (счёт), -r (рекурсия).
  • Шаблон — регулярное выражение; -E включает расширенный синтаксис с | и +.
Проверьте себя
1. Что делает флаг -v у grep?
AВключает подробный вывод
BПоказывает версию
CВыводит строки БЕЗ совпадения с шаблоном
DИщет без учёта регистра
2. Как посчитать количество строк со словом ERROR в файле?
Agrep -n ERROR file
Bgrep -c ERROR file
Cgrep -v ERROR file
Dgrep -i ERROR file
3. Зачем grep нужен флаг -E?
AЧтобы искать в нескольких файлах
BЧтобы включить расширенные регулярные выражения (| и + работают напрямую)
CЧтобы экранировать вывод
DЧтобы игнорировать регистр