linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Команды/cmd-grep

kb/commands ── Команды ── beginner

grep - поиск строк по шаблону

`grep` ищет строки по regex'у в stdin или файлах. Главные режимы: `-E` (ERE), `-P` (PCRE), `-F` (фиксированная строка), `-r` (рекурсивно по дереву).

view as markdownaka: grep-command, grep-regex, egrep, fgrep

Базовый синтаксис

grep [OPTIONS] PATTERN [FILE...]

По умолчанию grep использует BRE (Basic Regular Expressions) - это значит что +, ?, (, ), {, } в шаблоне трактуются как литералы, если не экранированы. Чтобы получить «обычные» regex'ы - используй -E (или egrep, который то же самое):

bash
grep    'foo\+'  file       # BRE: + надо экранировать
grep -E 'foo+'   file       # ERE: уже не надо

Главные флаги

флагзначение
-iбез учёта регистра
-vинвертировать (строки БЕЗ совпадения)
-nс номерами строк
-cтолько количество совпадений
-lтолько имена файлов где есть совпадение
-Lнаоборот - файлы где НЕТ совпадения
-oпечатать только совпавшую часть
-wцелое слово
-xцелая строка
-r / -Rрекурсивно по дереву (R резолвит symlink'и)
-A N / -B N / -C Nконтекст: After / Before / Around
--include='*.py'только эти файлы при -r
--exclude-dir=.gitпропускать каталог

Режимы regex

bash
grep -F 'a.b.c'  file       # -F: фиксированная строка, точки - это точки
grep    'a.b'    file       # BRE: . = любой символ
grep -E '^[0-9]+$' file     # ERE: [], +, {}, () работают без \
grep -P '\d{3}-\d{4}'  file # PCRE: \d, \w, look-ahead, named groups

PCRE даёт самые мощные шаблоны (lookahead, non-greedy, character classes как в Perl), но требует чтобы grep был собран с --enable-perl-regexp (на Ubuntu из коробки - да).

Рекурсивный поиск

bash
grep -rn 'TODO' .                         # все TODO в проекте, с номерами
grep -rni --include='*.py' 'fixme' src/   # только в .py файлах
grep -rln 'API_KEY' /etc                  # имена файлов с упоминанием
grep -rn 'password' . --exclude-dir=.git --exclude-dir=node_modules

Без -r grep будет жаловаться: Is a directory.

Контекст

bash
grep -n -B 2 -A 2 'ERROR' app.log    # 2 строки до и после
grep -C 3 'panic' /var/log/syslog     # ±3 строки вокруг

Якоря и группы

bash
grep '^Host'  ~/.ssh/config        # начало строки
grep '\.log$' filelist             # конец строки
grep -E '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b' file   # IPv4 (см. [[ipv4-addressing]])
grep -Eo '[a-z0-9.]+@[a-z0-9.]+'  # извлечь email-адреса

Связка с другими инструментами

Самая частая - pipe из cmd-find:

bash
find . -type f -name '*.conf' -print0 | xargs -0 grep -l 'listen 80'

▸найти все конф-файлы где упомянут "listen 80"

Или из вывода другой команды:

bash
ps aux | grep -v grep | grep nginx       # классика «без самой grep-строки»
ss -tn | grep ESTAB                      # ESTABLISHED-сессии
dmesg | grep -i 'oom'                    # см. [[oom-killer]]

Идиома | grep -v grep нужна потому что сам ps aux | grep nginx находит собственный процесс grep'а в выводе ps.

Exit codes (важно для скриптов)

  • 0 - было хоть одно совпадение
  • 1 - совпадений не нашлось
  • 2 - ошибка (нет файла, плохой regex)

Поэтому в bash:

bash
if grep -q ERROR app.log; then
  echo "errors present"
fi

-q (quiet) не выводит ничего, только ставит exit code.

ripgrep как современная альтернатива

rg (ripgrep) на порядки быстрее grep -r: автоматически уважает .gitignore, параллелит, использует SIMD. На больших репах разница драматическая. Но grep - POSIX и есть везде, поэтому база нужна.

§ команды

bash
grep -rn 'TODO' .

Все TODO в проекте, рекурсивно, с номерами строк

bash
grep -i error /var/log/syslog | tail

Последние строки с error/Error/ERROR (без учёта регистра)

bash
grep -c '^GET' access.log

Сколько GET-запросов в логе (только счётчик, не строки)

bash
grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' access.log

Строки начинающиеся с IPv4-адреса (ERE - без бэкслешей)

bash
grep -rln --include='*.py' 'import requests' .

Имена .py-файлов где импортируется requests

bash
grep -B 2 -A 5 'panic' /var/log/kern.log

Контекст вокруг паники: 2 до, 5 после

§ см. также

  • cmd-findfind - поиск файлов по предикатам`find` обходит дерево каталогов и применяет предикаты (имя, тип, время, размер, права). Действия: `-print` (по умолчанию), `-delete`, `-exec`, `| xargs`.
  • cmd-sedsed - потоковый редактор текстаsed - потоковый редактор: каждой строке применяет команды (`s/a/b/`, `d`, `p`, ...). `-i` правит файл на месте; `-E` включает ERE; адресный диапазон `/start/,/end/` фильтрует блок. Hold space - вторая память.
  • cmd-awkawk - обработка структурированного текста по полямawk бьёт строку на поля по FS (default - whitespace) и применяет pattern { action }. `$1..$NF`, `NR` (счётчик), BEGIN/END для пролога и итогов. Покрывает 80% задач "обработать колонки" без Python.
  • cmd-jqjq - запросы и трансформация JSONjq - запросный язык для JSON в shell. `.field`, `.array[]`, `select(...)`, `map(...)`, пайпы внутри выражения через `|`. `-r` снимает кавычки, `-c` пакует в строку. Идеально для curl + jq + grep.
  • file-permissionsFile permissions: rwx и chmodКаждый файл имеет три набора прав - для владельца, группы и остальных. Каждый набор это три бита: read (r), write (w), execute (x). Меняем через `chmod`.

§ упоминается в уроках

  • ›beginner-11-find-and-grep
  • ›intermediate-10-xargs-and-parallel
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки