Гид по технологиям

grep в PowerShell: findstr и Select-String

4 min read PowerShell Обновлено 30 Nov 2025
grep в PowerShell: findstr и Select-String
grep в PowerShell: findstr и Select-String

Кратко: Кратко: PowerShell не включает утилиту grep, но её можно заменить встроенными инструментами — findstr и Select-String. Используйте findstr для простых однострочных поисков в командной строке и Select-String для скриптов, когда нужен объектный вывод и гибкость регулярных выражений.

Быстрые ссылки

  • Использование findstr как grep в PowerShell
  • Использование Select-String как grep в PowerShell
grep

grep — мощная утилита поиска текста в Linux, но на Windows её нет по умолчанию. Вместо сторонних портов PowerShell предлагает эквиваленты, которые выполняют те же задачи в скриптах и командной строке.

Использование findstr для поиска в PowerShell

Есть несколько утилит поиска в Windows/PowerShell, каждая имеет свои сильные стороны. Самая простая — findstr, это нативный исполняемый файл Windows. Он хорошо заменяет grep для простых операций поиска в командной строке. Например, можно передать в него вывод команды

ls

через конвейер, чтобы найти совпадения:

ls | findstr "foo"

Сравнение методов поиска текста в PowerShell

findstr поддерживает поиск нескольких слов одновременно, подстановочные символы и ключ /R для простых регулярных выражений:

ls | findstr /R ba[a-z]\.txt

Пример использования findstr с регулярным выражением

Если нужно явно искать строку с пробелом, используйте флаг /C::

ls | findstr /C:"foo bar"

Если вы привыкли к Linux-памяти мышц и не хотите заводить новую команду, можно создать псевдоним “grep”, который будет ссылаться на findstr:

new-alias grep findstr

Важно: findstr — это внешний процесс. Он возвращает обычный текстовый вывод, а не объекты PowerShell, поэтому его сложнее автоматически парсить в скриптах PowerShell.

Использование Select-String для поиска в PowerShell

Более “родной” для PowerShell вариант — cmdlet Select-String. Он выполняет многие те же задачи, что и findstr, но возвращает объекты, удобные для дальнейшей обработки.

Преимущества Select-String:

  • Возвращает объекты MatchInfo с полями (Line, Filename, LineNumber и т.д.).
  • Поддерживает tab-completion и хорошо интегрируется в скрипты.
  • Проще комбинировать с другими cmdlet через конвейер.

Примеры использования:

ls | Select-String foo
ls | Select-String -Pattern 

Поиск через Select-String с объектным выводом

Чтобы искать внутри файлов, передайте параметр -Path или используйте Get-Content:

Select-String -Path ".\foo.txt" -Pattern ba.*

Результаты поиска Select-String в файле

Если хотите пользоваться командой “grep” в интерактивной сессии, можно создать псевдоним для Select-String:

remove-alias grep
new-alias grep Select-String

Как выбрать: простое правило

  • Нужен быстрый поиск в выводе команд в интерактивной сессии — выберите findstr.
  • Пишете скрипт или хотите объектный вывод для постобработки — используйте Select-String.
flowchart TD
  A[Требуется поиск текста?] --> B{Это скрипт или интерактив?}
  B -->|Интерактив, быстрая проверка| C[findstr]
  B -->|Скрипт или нужна обработка| D[Select-String]
  C --> E[Текстовый вывод]
  D --> F[Объект MatchInfo]

Сравнение findstr и Select-String

КритерийfindstrSelect-String
ТипВнешний исполняемый файлPowerShell cmdlet
ВыводТекстОбъекты MatchInfo
RegexБазовые /RПолные .NET regex
Интеграция в скриптСложнее парситьЛегко обрабатывать в PowerShell

Когда это не сработает

  • findstr не поддерживает всю мощь .NET-совместимых регулярных выражений; сложные паттерны могут не работать.
  • Select-String может быть медленнее при очень больших объёмах данных, если вы не оптимизируете чтение файлов (используйте чтение по частям).
  • Оба инструмента чувствительны к кодировке файла; при нестандартной кодировке потребуется предварительная конверсия (например, через Get-Content -Encoding).

Альтернативы

  • Использовать WSL и родной утилит grep (если установлена подсистема Windows для Linux).
  • Установить GNU grep через пакеты (Scoop, Chocolatey) для совместимости с Linux-скриптами.
  • Для больших наборов данных — специализированные инструменты поиска (ripgrep, ack).

Чек‑лист: кто что использует

  • Системный администратор: findstr для быстрых проверок логов в сессии.
  • Скриптер/DevOps: Select-String для парсинга и передачи данных дальше в скрипте.
  • Разработчик: ripgrep/grep через WSL для привычной среды и расширенных паттернов.

Шпаргалка (частые команды)

# Быстрый поиск слова в выводе
ls | findstr "error"

# Поиск с регулярным выражением
ls | findstr /R "err.*[0-9]"

# Объектный поиск и фильтрация
ls | Select-String -Pattern "TODO" | Select-Object Filename, LineNumber, Line

# Поиск в файле
Select-String -Path ".\logs\*.log" -Pattern "Exception"

# Создать псевдоним grep -> Select-String
new-alias grep Select-String

# Удалить псевдоним
remove-alias grep

Критерии приёмки

  • Команда должна находить строки с ожидаемым шаблоном.
  • Для скриптов вывод должен быть парсируем (рекомендуется Select-String).
  • Проверить кодировку файлов перед поиском.

Риски и рекомендации

  • Проверьте кодировку: при неверной кодировке возможны пропуски совпадений.
  • Для критичных по скорости задач протестируйте производительность на реальных объёмах данных.
  • Не полагайтесь на синтаксическую эквивалентность findstr и grep — регулярные выражения отличаются.

Итог

findstr и Select-String покрывают большинство случаев использования grep в среде Windows. Выберите findstr для простоты и скорости в интерактивной работе и Select-String для скриптов, где нужен объектный вывод и лучшая интеграция с PowerShell. Если нужен полный набор возможностей GNU grep, рассмотрите установку grep/ripgrep через WSL или менеджеры пакетов.

Ключевые выводы:

  • findstr — быстро и просто для командной строки.
  • Select-String — гибко и удобно для скриптов.
  • Для сложных regex или совместимости используйте WSL или сторонние инструменты.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Unity Lights: циферблат Apple Watch для Black History Month
Apple Watch

Unity Lights: циферблат Apple Watch для Black History Month

Обновление видеодрайвера для Rainbow Six Siege
Windows

Обновление видеодрайвера для Rainbow Six Siege

Ограничение частоты запросов в ASP.NET Core
Backend

Ограничение частоты запросов в ASP.NET Core

Исправление лагов Android: TRIM и LagFix
Mobile

Исправление лагов Android: TRIM и LagFix

Семафоры в Bash: что это и как реализовать
Bash

Семафоры в Bash: что это и как реализовать

Что делать при перегреве PS5
Гайды

Что делать при перегреве PS5