grep в PowerShell: findstr и Select-String
Кратко: Кратко: PowerShell не включает утилиту grep, но её можно заменить встроенными инструментами — findstr и Select-String. Используйте findstr для простых однострочных поисков в командной строке и Select-String для скриптов, когда нужен объектный вывод и гибкость регулярных выражений.
Быстрые ссылки
- Использование findstr как grep в PowerShell
- Использование Select-String как grep в PowerShell
grepgrep — мощная утилита поиска текста в Linux, но на Windows её нет по умолчанию. Вместо сторонних портов PowerShell предлагает эквиваленты, которые выполняют те же задачи в скриптах и командной строке.
Использование findstr для поиска в PowerShell
Есть несколько утилит поиска в Windows/PowerShell, каждая имеет свои сильные стороны. Самая простая — findstr, это нативный исполняемый файл Windows. Он хорошо заменяет grep для простых операций поиска в командной строке. Например, можно передать в него вывод команды
lsчерез конвейер, чтобы найти совпадения:
ls | findstr "foo"
findstr поддерживает поиск нескольких слов одновременно, подстановочные символы и ключ /R для простых регулярных выражений:
ls | findstr /R ba[a-z]\.txt
Если нужно явно искать строку с пробелом, используйте флаг /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 fools | Select-String -Pattern 
Чтобы искать внутри файлов, передайте параметр -Path или используйте Get-Content:
Select-String -Path ".\foo.txt" -Pattern ba.*
Если хотите пользоваться командой “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
| Критерий | findstr | Select-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 или сторонние инструменты.
Похожие материалы
Unity Lights: циферблат Apple Watch для Black History Month
Обновление видеодрайвера для Rainbow Six Siege
Ограничение частоты запросов в ASP.NET Core
Исправление лагов Android: TRIM и LagFix
Семафоры в Bash: что это и как реализовать