Перейти к основному содержимому

Поиск текста в файлах — grep, findstr и Select-String

Разработчику Инженеру

См. также


Как искать текст в файлах

Что такое поиск текста

Поиск по тексту — это поиск фрагмента строки внутри файла или сразу во многих файлах. В отличие от поиска файла по имени в Проводнике или Everything, здесь важно содержимое — слово в логе, функция в коде, настройка в конфиге.

Такой поиск нужен, когда файл уже есть, но непонятно, в какой строке нужная информация, или нужно найти все вхождения по папке проекта.

Быстрый поиск — что можно сделать

ЗадачаТипичный способ
Найти слово в открытом документеCtrl+F / Cmd+F
Найти по всем файлам в папкеVS Code, Notepad++, FileSeek
Найти на диске Windows / macOSПроводник, Spotlight, mdfind
Найти в логах и на сервереgrep, findstr, Select-String
Отфильтровать вывод командыконвейер | и grep

Сначала удобнее освоить горячие клавиши в программе, затем — поиск по папке, и только после этого — терминал (ниже в статье).

В одном открытом документе

Для любого открытого файла (Word, PDF в просмотрщике, Блокнот, страница в браузере, редактор кода):

  • WindowsCtrl+F;
  • macOSCmd+F.

Введите искомый текст. Программа подсветит совпадения в текущем документе и позволит переходить между ними (F3 или кнопки "далее" / "назад" в зависимости от приложения).

По папке и проекту

Notepad++ (Windows)

  1. Ctrl+Shift+F — окно поиска по файлам.
  2. Введите текст, укажите папку.
  3. Нажмите "Найти все" — список файлов и строк с совпадениями.

Подходит для конфигов, логов и скриптов на одной машине. Обзор редактора — Notepad++ и VS Code.

Visual Studio Code (Windows, macOS, Linux)

  1. Ctrl+Shift+F (на Mac — Cmd+Shift+F).
  2. Откроется вкладка "Поиск" по рабочей области.
  3. Доступны опции — учёт регистра, только целые слова, регулярные выражения, маска файлов (*.ts, src/**).

Для разработчиков это основной способ сквозного поиска по репозиторию без терминала.

Windows — Проводник и системный поиск

В Проводнике в правом верхнем углу есть строка поиска. Введите запрос — Windows покажет файлы, в которых, по мнению индекса, встречается текст (работает не для всех типов файлов и не на всех дисках).

Для более широкого поиска по компьютеру — встроенная утилита "Поиск" в меню "Пуск" (или поле поиска на панели задач в новых версиях Windows).

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

macOS — Spotlight и Terminal

SpotlightCmd+Space, введите запрос. Система ищет по проиндексированному содержимому (документы, почта, заметки — в зависимости от настроек).

В Терминале можно вызвать mdfind — поиск по метаданным Spotlight из командной строки.

mdfind "ваш_текст"
mdfind -onlyin ~/Projects "import React"

Linux — grep по папке

В командной строке для текста в файлах используют grep. Пример рекурсивного поиска с номерами строк и точным совпадением слова (-w):

grep -rnw '/путь/к/папке' -e 'ваш_текст'
КлючСмысл
-rрекурсивно по каталогу
-nномер строки
-wцелое слово
-eшаблон (удобно для строк с - в начале)

Подробные примеры и флаги — в разделе grep ниже.

Где обычный поиск не сработает

Стандартный Ctrl+F и поиск Проводника рассчитаны на текстовое содержимое. Без специальных программ сложно искать внутри:

  • растровых картинок (PNG, JPG) — в файле нет текстового слоя, нужен OCR;
  • сканов PDF — то же самое, пока документ не распознан;
  • архивов (ZIP, RAR, 7z) — сначала нужно распаковать или использовать архиватор с просмотром;
  • бинарных форматов (часть .exe, базы данных, проприетарные форматы).

Текстовые .log, .txt, .md, .json, .html, исходники — ищутся обычными средствами.

FileSeek (Windows)

FileSeek — отдельная утилита для поиска текста внутри файлов по дереву папок. Everything в первую очередь ищет по имени файла; FileSeek ориентирован на содержимое.

  • рекурсивный обход каталогов;
  • фильтры по маске (*.js, *.log);
  • опции регистра и RegEx;
  • заявлена поддержка ряда форматов, включая часть PDF и офисных документов (зависит от типа файла).

Разбор установки и сценариев — в файловых менеджерах и утилитах.


Поиск из командной строки

Когда нужны логи на сервере, скрипты, CI или фильтрация вывода программы, переходят к консольным утилитам. На Linux и macOS это в первую очередь grep; в англоязычной среде говорят grepping — "прогнать grep по файлам". В Windows — findstr (CMD) и Select-String (PowerShell).

Логи, конфиги, package.json, исходники — текстовые файлы из строк. Типичные задачи в терминале:

  • показать только строки со словом error;
  • найти все вхождения import в каталоге src/.
grep и find — разные задачи

find ищет файлы и каталоги по имени, дате, размеру (find . -name "*.log").
grep ищет строки внутри уже известных файлов (grep "error" app.log).
Частая связка — сначала find отбирает файлы, затем grep фильтрует содержимое.

Как работает фильтр в терминале

Вы даёте утилите источник (файл, каталог или поток из другой команды) и шаблон. На выход — только строки, которые шаблону соответствуют (по умолчанию — вместе с именем файла, если файлов несколько).

файл(ы) + шаблон → grep / findstr / Select-String → подходящие строки

Шаблон может быть простой подстрокой ("error") или регулярным выражением (RegEx). Для сложных правил см. RegEx — справочник; готовые команды для логов — Lab / 615 и 1115 — рецепты.

Конвейер | передаёт stdout одной команды на stdin другой. Так отфильтровывают вывод длинных команд.

npm list | grep "lodash"
cat app.log | grep ERROR | tail -20

Разбор |, >, && — в знаках препинания.


grep (Linux, macOS, Git Bash, WSL)

grep — консольная утилита для поиска строк по шаблону. Название расшифровывают как Globally search for a Regular Expression and Print — глобальный поиск по регулярному выражению с выводом результатов.

Поиск слова в одном файле

grep "error" server.log

Покажет все строки, где есть подстрока error (регистр учитывается).

Без учёта регистра

grep -i "react" package.json

Найдёт React, react, REACT.

Рекурсивно по каталогу

grep -r "import" src/

Пройдёт все файлы в src/ (включая подкаталоги). С флагом -n в выводе будут номера строк — grep -rn "TODO" .

Полезные флаги (кратко)

ФлагСмысл
-iбез учёта регистра
-r / -Rрекурсивно по каталогу
-nномер строки
-vинверсия — строки без совпадения
-cтолько счётчик совпадений
-Eрасширенный RegEx (как egrep)
-lтолько имена файлов, где есть совпадение

Шпаргалка по Linux-командам и примеры awk / sort рядом — 101 — grep.

Фильтрация вывода других команд

ps aux | grep python
ss -tlnp | grep 8080
tail -f /var/log/myapp/app.log | grep ERROR

На macOS встроенный grep иногда слабее GNU-версии; для больших репозиториев удобнее rg (ripgrep) — см. ниже.


findstr и Select-String в Windows

findstr (CMD)

Быстрый поиск в классической командной строке.

findstr "error" app.log
findstr /I "timeout" C:\logs\*.log
findstr /N /R "error" app.log
КлючСмысл
/Iбез учёта регистра
/Nномера строк
/Rшаблон как regex (упрощённый синтаксис, свой для CMD)
/Sпо подкаталогам

В конвейере CMD.

tasklist | findstr python
netstat -ano | findstr :80
Кодировка и pipe в CMD

findstr в pipe с кириллицей может вести себя непредсказуемо — дело в ANSI/UTF-8 на stdin. Для Unicode-текста надёжнее PowerShell и Select-String. Подробнее — локализация и символы в Windows (раздел про findstr в pipe).

Select-String (PowerShell)

Рекомендуемый путь в современной Windows-разработке.

Select-String -Pattern "error" -Path "app.log"
Select-String -Path "C:\Logs\*.log" -Pattern "ERROR|FATAL"
Get-Content "app.log" | Select-String -Pattern "timeout"

Шаблоны здесь — .NET RegEx (как в C#). Углублённо про объекты в конвейере — PowerShell — вводная и 113.

Шпаргалка CMD/PowerShell — 102 — поиск.

Тот же grep на Windows

  • Git Bash или WSL — те же команды, что на Linux.
  • OpenSSH / удалённый серверgrep на стороне Linux, даже если локально Windows.

ripgrep (rg) — быстрый поиск в проекте

ripgrep (rg) — кроссплатформенная утилита на Rust, по умолчанию уважает .gitignore и пропускает node_modules, если каталог в ignore.

rg -n "TODO|FIXME" --type js
rg -i "connection timeout" .
rg --glob "*.log" "\[ERROR\]"

Для ежедневной работы в репозитории многие разработчики предпочитают rg вместо grep -r. Флаги и рецепты — 1115 — ripgrep.


В веб-разработке

ЗадачаПример
Есть ли пакет в дереве зависимостейnpm list | grep lodash
Где в коде старый импортgrep -rn "from 'old-lib'" src/ или rg "from 'old-lib'" src
Ошибки в логе dev-сервераgrep -i error logs/dev.log
Фильтр логов Android на Windowsadb logcat | findstr MyApp

На сервере после деплоя те же приёмы для /var/log/... — см. фронтенд и бэкенд — минимум команд.

node_modules

Рекурсивный grep -r по корню проекта без исключений может идти минутами из‑за node_modules. Ограничивайте путь (src/), используйте rg или исключения (grep -r --exclude-dir=node_modules).


Когда хватит подстроки, когда нужен RegEx

СитуацияДостаточно
Точное слово в логеgrep "ERROR" или grep -i error
Несколько вариантов`grep -E 'WARN
Дата, IP, email по маскеRegEx + -E / -Pattern
Замена текста в файлеsed (Unix) или PowerShell -replace1115

Если шаблон непонятен — сначала RegEx с нуля, затем проверка на regex101.com с нужным движком (PCRE, .NET, JavaScript).


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

ТемаКуда
Синтаксис RegEx615
grep, sed, awk, findstr — рецепты1115
Готовые паттерны и командыLab / 615, Lab / 1151
Пайп и перенаправление11
Linux / Windows — полные справочники101, 102
grep в Bash-скриптахBash — RegEx и grep
Поиск в IDE и утилитахпродвинутый софт / FAQ
FileSeek, Everythingфайловые менеджеры
Notepad++, VS Codeредакторы