5 июля 2019

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

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

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

Где:

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

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

Где:

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

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

Где:

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

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

Где:

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

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

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

Где:

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

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

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

  • ASCII
  • BigEndianUnicode
  • OEM
  • Unicode
  • UTF7
  • UTF8
  • UTF8BOM
  • UTF8NoBOM
  • UTF32


Опубликовано 05.07.2019 от evgeniyalf в категории "PowerShell