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

Как искать в Powershell используя Select-String

В Powershell есть командлет, похожий на grep в Linux, Select-String. С помощью него мы можем искать как файлы, так и вхождения строк и, по желанию, используя регулярные выражения.

Для поиска внутри файла можно выполнить следующий командлет:

Select-String -Path *.txt -Pattern "fix"

Где:

  • Path — путь до директории или документа. В моем случае будут искаться все файлы с расширением .txt, т.к. знак * говорит что мы не знаем что находится слева. Если путь не указан, то он используется по умолчанию, откуда запущен powershell.
  • Pattern — строка, которую мы ищем внутри файла. Этот ключ используется для регулярных выражений. Для использования простого поиска, без регулярки, нужно ставить -SimpleMatch

Мы можем искать не только в файлах, но и в самих строках:

$str = "Hello World"
Select-String -InputObject $str -SimpleMatch "hello","idk"

Где:

  • InputObject — объект, в котором мы будем искать переменную
  • SimpleMatch — простое совпадение. В моем случае их два. Если «hello» или «idk» будет в строке, то команда вернет строку.

Если мы используем путь в какую-то папку, то мы можем включать и исключать какие-то свойства:

$path =  "C:Folder1New folder*"
Select-String -Path $path -SimpleMatch "fix" -Include "*.txt" -Exclude "text*" -CaseSensitive

Где:

  • $path — переменная с путем, которая включает все файлы в папке «New Folder».
  • Include — включает все файлы. В моем случае с расширением .txt
  • Exclude — исключает все файлы, которые начинаются на text.
  • CaseSensitive — учет регистра. В powershell, по умолчанию, буква «а» и «А» одинаковые, а с этим ключом они будут разными.

Т.к. командлет ищет только в текущей папке, но мы можем использовать другой, для более глубокого поиска файлов через Powershell:

Get-ChildItem -Path 'C:Folder1' -Recurse -Exclude "*.mp3" | Select-String -SimpleMatch "fix"

Где:

  • Recurse — рекурсивный поиск т.е. поиск по всем папкам включительно.
  • Exclude — исключаем файлы с расширением mp3

Если в папке много файлов, то конечно быстрее будет сначала отфильтровать файлы через powershell Get-ChildItem, а затем искать в них нужные строки через Select-String.

С помощью такой команды мы можем исключить файлы, к которым у нас нет доступа иначе может быть ошибка:

Get-ChildItem -Path 'C:Folder1' -Recurse -Exclude "*.mp3" -ErrorAction SilentlyContinue | Select-String -SimpleMatch "fix" -NotMatch

Где:

  • NoMatch — говорит, что нам нужны только те строки, где нет «fix» или дословно «Не совпадает»
  • ErrorAction — со значением SilentlyContinue — говорит «не уведомлять об ошибках».

Разницу с Nomatch можно увидеть на картинке:

Если файл или строка в другой кодировке, то мы можем указать дополнительный ключ в виде -Encoding. Он может принимать следующие значения:

  • ASCII
  • BigEndianUnicode
  • OEM
  • Unicode
  • UTF7
  • UTF8
  • UTF8BOM
  • UTF8NoBOM
  • UTF32
Опубликовано вPowershell

Ваш комментарий будет первым

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *