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


05 июля 2019


GREP в Powershell - поиск через Select-String

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

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

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

Где:

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

Powershell Grep поиск строки

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

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

Где:

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

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

$path =  "C:\Folder1\New 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 можно увидеть на картинке:

Powershell Grep поиск файлов

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

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

Теги: #powershell


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.