Оператор PowerShell -match
Сортировка объектов
Сортировка элементов конвейера – еще одна операция, которая часто применяется при конвейерной обработке объектов. Данную операцию осуществляет командлет Sort-Object: ему передаются имена свойств, по которым нужно произвести сортировку, а он возвращает данные, упорядоченные по значениям этих свойств.
Например, для вывода списка запущенных в системе процессов, упорядоченного по затраченному процессорному времени (свойство cpu), можно воспользоваться следующим конвейером: PS C:\> Get-Process | Sort-Object cpuДля сортировки в обратном порядке используется параметр Descending:
PS C:\> Get-Process | Sort-Object cpu -DescendingВ рассмотренных нами примерах конвейеры состояли из двух командлетов. Это не обязательное условие, конвейер может объединять и большее количество команд, например:
Get-Process | Where-Object {$_.Id -gt 1000} | Sort-Object cpu –DescendingДля начала изучения мы будем использовать оператор PowerShell -match, который позволяет сравнивать текст слева от него, с регулярным выражением справа. В случае если текст подпадает под регулярное выражение, оператор выдаёт True, иначе – False.
PS C:\> "PowerShell" -match "Power"
True
При сравнении с регулярным выражением ищется лишь вхождение строки, полное совпадение текста необязательно (разумеется, это можно изменить). То есть достаточно, чтобы регулярное выражение встречалось в тексте.
PS C:\> "Shell" -match "Power"
False
PS C:\> "PowerShell" -match "rsh"
True
Еще одна тонкость: оператор -match по умолчанию не чувствителен к регистру символов (как и другие текстовые операторы в PowerShell), если же нужна чувствительность к регистру, используется -cmatch:
PS C:\> "PowerShell" -cmatch "rsh"
False
В регулярных выражениях можно использовать и группы символов:
PS C:\> Get-Process | where {$_.name -match "sy[ns]"}
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------ ----- ----- ----- ------ -- -----------
165 11 2524 8140 79 0,30 5228 mobsync
114 10 3436 3028 83 50,14 3404 SynTPEnh
149 11 2356 492 93 0,06 1592 SynTPStart
810 0 116 380 6 4 System
И диапазоны в этих группах:
PS C:\> "яблоко","апельсин","груша","абрикос" -match "а[а-п]"
апельсин
абрикос
В левой части оператора -match находится массив строк, и оператор соответственно вывел лишь те строки, которые подошли под регулярное выражение.
Перечисления символов можно комбинировать, например группа [агдэ-я] будет означать “А или Г или Д или любой символ от Э до Я включительно”. Но гораздо интереснее использовать диапазоны для определения целых классов символов. Например [а-я] будет означать любую букву русского алфавита, а [a-z] английского. Аналогично можно поступать с цифрами – следующая команда выведет все процессы, в именах которых встречаются цифры:
PS C:\> Get-Process | where {$_.name -match "[0-9]"}
Так как эта группа используется достаточно часто, для неё была выделена специальная последовательность – \d (от слова digit). По смыслу она полностью идентична [0-9], но короче.
PS C:\> Get-Process | where {$_.name -match "\d"}
Так же последовательность была выделена для группы “любые буквы любого алфавита, любые цифры, или символ подчеркивания” эта группа обозначается как \w (от word) она примерно эквивалентна конструкции [a-zа-я_0-9] (в \w еще входят символы других алфавитов которые используются для написания слов).
Другая популярная группа: \s – “пробел, или другой пробельный символ” (например символ табуляции). Сокращение от слова space. В большинстве случаев вы можете обозначать пробел просто как пробел, но эта конструкция добавляет читабельности регулярному выражению.
Не менее популярной группой можно назвать символ. (точка). Точка в регулярных выражениях аналогична по смыслу знаку вопроса в подстановочных символах, то есть обозначает один любой символ.
Все вышеперечисленные конструкции можно использовать как отдельно, так и в составе групп, например [\s\d] будет соответствовать любой цифре или пробелу. Если вы хотите указать внутри группы символ - (тире/минус) то надо либо экранировать его символом \ (обратный слеш), либо поставить его в начале группы, чтобы он не был случайно истолкован как диапазон:
PS C:\> "?????","Word","123","-" -match "[-\d]"