Главная страница
Навигация по странице:

  • 1.9.2 Просмотр структуры объектов

  • 1.9.3 Фильтрация объектов в конвейере

  • 1.9.4 Сортировка объектов

  • 1.9.5 Использование переменных

  • 1.9.6 Создание и использование массивов

  • 1.10 Регулярные выражения – назначение и использование

  • 1.10.1 Оператор PowerShell -match

  • 1.10.2 Использование групп символов

  • 1.10.3 Отрицательные группы и якоря

  • ЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л. Практикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01


    Скачать 2.71 Mb.
    НазваниеПрактикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01
    Дата15.10.2022
    Размер2.71 Mb.
    Формат файлаpdf
    Имя файлаЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л.pdf
    ТипПрактикум
    #735270
    страница7 из 21
    1   2   3   4   5   6   7   8   9   10   ...   21
    1.9.1 Конвейеризация объектов в PowerShell
    Конвейер в PowerShell – это последовательность команд, разделенных между собой знаком
    |
    (вертикальная черта). Каждая команда в конвейере получает объект от предыдущей команды, выполняет определенные операции над ним и передает следующей команде в конвейере. С точки зрения пользователя, объекты упаковывают связанную информацию в форму, в которой информацией проще манипулировать как единым блоком и из которой при необходимости извлекаются определенные элементы.
    Передача данных между командами в виде объектов имеет большое преимущество над обычным обменом информацией посредством потока текста. Ведь команда, принимающая поток текста от другой утилиты, должна его проанализировать, разобрать и выделить нужную ей информацию, а это может быть непросто, так как обычно вывод команды больше ориентирован на визуальное восприятие человеком (это естественно для интерактивного режима работы), а не на удобство последующего синтаксического разбора.
    При передаче по конвейеру объектов этой проблемы не возникает, здесь нужная информация извлекается из элемента конвейера простым обращением к соответствующему свойству объекта. Однако возникает новый вопрос: каким образом узнать, какие именно свойства есть у объектов, передаваемых по конвейеру? Ведь при выполнении того или иного командлета мы на экране видим только одну или несколько колонок отформатированного текста.
    Пример Запустим командлет Get-Process, который выводит информацию о запущенных в системе процессах (рис.2):
    PS C:\> Get-Process

    65
    Рис.2- Информацию о запущенных в системе
    Фактически на экране мы видим только сводную информацию
    (результат форматирования полученных данных), а не полное представление выходного объекта. Из этой информации непонятно, сколько точно свойств имеется у объектов, генерируемых командой
    Get-
    Process
    , и какие имена имеют эти свойства. Например, мы хотим найти все "зависшие" процессы, которые не отвечают на запросы системы.
    Можно ли это сделать с помощью командлета
    Get-Process
    , какое свойство нужно проверять у выводимых объектов?
    Для ответа на подобные вопросы нужно научиться исследовать структуру объектов PowerShell, узнавать, какие свойства и методы имеются у этих объектов.
    1.9.2 Просмотр структуры объектов
    Для анализа структуры объекта, возвращаемого определенной командой, проще всего направить этот объект по конвейеру на командлет
    Get-Member
    (псевдоним gm
    ), например (рис.3):
    PS C:\> Get-Process | Get-Member
    Рис.3- объект по конвейеру на командлет
    Get-Member
    Здесь мы видим имя .NET-класса, экземпляры которого возвращаются в ходе работы исследуемого командлета (в нашем примере это класс System.Diagnostic.Process), а также полный список элементов

    66 объекта (в частности, интересующее нас свойство Responding, определяющего "зависшие" процессы). При этом на экран выводится очень много элементов, просматривать их неудобно. Командлет
    Get-Member позволяет перечислить только те элементы объекта, которые являются его
    свойствами. Для этого используется параметр
    MemberType со значением
    Properties
    :(рис.4)
    PS C:\> Get-Process | Get-Member -MemberType Property
    Рис.4- Элементы объекта, которые являются его свойствами
    Процессам ОС соответствуют объекты, имеющие очень много свойств, на экран же при работе командлета
    Get-Process выводятся лишь несколько из них (способы отображения объектов различных типов задаются конфигурационными файлами в формате XML, находящимися в каталоге, где установлен файл powershell.exe).
    Рассмотрим наиболее часто используемые операции над элементами конвейера: фильтрации и сортировки.
    1.9.3 Фильтрация объектов в конвейере
    В PowerShell поддерживается возможность фильтрации объектов в конвейере, т.е. удаление из конвейера объектов, не удовлетворяющих определенному условию. Данную функциональность обеспечивает командлет
    Where-Object
    , позволяющий проверить каждый объект, находящийся в конвейере, и передать его дальше по конвейеру, только если объект удовлетворяет условиям проверки.
    Например, для вывода информации о "зависших" процессах
    (объекты, возвращаемые командлетом
    Get-Process
    , у которых свойство
    Responding равно
    False
    ) можно использовать следующий конвейер:
    Get-Process | Where-Object {-not $_.Responding}
    Другой пример – оставим в конвейере только те процессы, у которых значение идентификатора (свойство
    Id
    ) больше 1000:
    Get-Process | Where-Object {$_.Id -gt 1000}

    67
    В блоках сценариев командлета
    Where-Object для обращения к текущему объекту конвейера и извлечения нужных свойств этого объекта используется специальная переменная
    $_
    , которая создается оболочкой
    PowerShell автоматически. Данная переменная используется и в других командлетах, производящих обработку элементов конвейера.
    Условие проверки в
    Where-Object задается в виде блока
    сценария – одной или нескольких команд PowerShell, заключенных в фигурные скобки
    {}
    . Результатом выполнения данного блока сценария должно быть значение логического типа:
    True
    (истина) или
    False
    (ложь). Как можно понять из примеров, в блоке сценария используются специальные операторы сравнения.
    Замечание. В PowerShell для операторов сравнения не используются обычные символы
    >
    или
    <
    , так как в командной строке они обычно означают перенаправление ввода/вывода.
    Основные операторы сравнения приведены в (табл. 1).
    Таблица 1.
    Операторы сравнения в PowerShell
    Оператор Значение
    Пример
    (возвращается значение True)
    -eq равно
    10 -eq 10
    -ne не равно
    9 -ne 10
    -lt меньше
    3 -lt 4
    -le меньше или равно
    3 –le 4
    -gt больше
    4 -gt 3
    -ge больше или равно
    4 -ge 3
    -like сравнение на совпадение с учетом подстановочного знака в тексте "file.doc"
    –like
    "f*.doc"
    -notlike сравнение на несовпадение с учетом подстановочного знака в тексте "file.doc"
    –notlike
    "f*.rtf"
    -contains содержит
    1,2,3 –contains 1
    - notcontains не содержит
    1,2,3 –notcontains 4
    Операторы сравнения можно соединять друг с другом с помощью логических операторов (см. табл. 2).

    68
    Таблица 2.
    Логические операторы в PowerShell
    Оператор Значение
    Пример (возвращается значение True)
    -and логическое И
    (10 -eq 10) –and (1 –eq 1)
    -or логическое ИЛИ (9 -ne 10) –or (3 –eq 4)
    -not логическое НЕ -not (3 –gt 4)
    ! логическое НЕ !(3 -gt 4)
    1.9.4 Сортировка объектов
    Сортировка элементов конвейера – еще одна операция, которая часто применяется при конвейерной обработке объектов. Данную операцию осуществляет командлет
    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
    1.9.5 Использование переменных
    В переменных хранятся все возможные значения, даже если они являются объектами. Имена переменных в PowerShell всегда должны начинаться с символа «$». Можно сохранить список процессов в переменной, это позволит в любое время получать доступ к списку процессов. Присвоить значение переменной легко:
    $a = get-process | sort-object CPU
    Вывести содержимое переменной можно, просто напечатав в командной строке $a.
    1.9.6 Создание и использование массивов
    Для создания и инициализации массива достаточно присвоить значения его элементам. Значения, добавляемые в массив, разделяются запятыми и отделяются от имени массива символом присваивания.
    Например, следующая команда создаст массив $a из трех элементов:
    PS C:\> $a=1,5,7

    69
    PS C:\>$a
    1 5
    7
    Можно создать и инициализировать массив, используя оператор диапазона (..). Например, команда
    PS C:\> $b=10..15 создает и инициализирует массив $b, содержащий 6 значений 10, 11, 12,
    13, 14 и 15.
    Для создания массива может использоваться операция ввода значений его элементов из текстового файла:
    PS C:\> $f = Get-Content c:\data\numb.txt –TotalCount 25
    PS C:\>$f.length
    25
    В приведенном примере результат выполнения командлета Get-
    Content присваивается массиву $f. Необязательный параметр –TotalCount ограничивает количество прочитанных элементов величиной 25. Свойство объекта массив – length – имеет значение, равное количеству элементов массива, в примере оно равно 25 (предполагается, что в текстовом файле munb.txt по крайней мере 25 строк).
    1.9.6.1 Обращение к элементам массива
    Длина массива (количество элементов) хранится в свойcтве Length.
    Для обращения к определенному элементу массива нужно указать его индекс в квадратных скобках после имени переменной. Нумерация элементов массива всегда начинается с нуля. В качестве индекса можно указывать и отрицательные значения, отсчет будет вестись с конца массива
    – индекс -1 соответствует последнему элементу массива.
    1.9.6.2 Операции с массивами
    По умолчанию массивы PowerShell могут содержать элементы разных типов (целые 32-х разрядные числа, строки, вещественные и другие), то есть являются полиморфными. Можно создать массив с жестко заданным типом, содержащий элементы только одного типа, указав нужный тип в квадратных скобках перед именем переменной. Например, следующая команда создаст массив 32-х разрядных целых чисел:
    PS C:\> [int[]]$a=1,2,3
    Массивы PowerShell базируются на .NET-массивах, имеющих фиксированную длину, поэтому обращение за предел массива фиксируется как ошибка. Имеется способ увеличения первоначально определенной длины массива. Для этого можно воспользоваться оператором конкатенации + или +=. Например, следующая команда добавит к массиву
    $a два новых элемента со значениями 5 и 6:

    70
    PS C:\> $a
    1 2
    3 4
    PS C:\>$a+=5,6
    PS C:\>$a
    1 2
    3 4
    5 6
    При выполнении оператора += происходит следующее: создается новый массив, размер которого достаточен для помещения в него всех элементов; первоначальное содержимое массива копируется в новый массив; новые элементы копируются в конец нового массива.
    Таким образом, на самом деле создается новый массив большего размера.
    Можно объединить два массива, например $b и $c в один с помощью операции конкатенации +. Например:
    PS C:\> $d=$b+$c
    1.10 Регулярные выражения – назначение и использование
    Регулярные выражения (или сокращенно “регэкспы” (regexp, regular expressions)) обладают огромной мощью, и способны сильно упростить жизнь системного администратора или программиста. В PowerShell регулярные выражения легко доступны, удобны в использовании и максимально функциональны. PowerShell использует реализацию регулярных выражений .NET.
    Регулярные выражения - это специальный мини-язык, служащий для разбора (parsing) текстовых данных. С его помощью можно разделять строки на компоненты, выбирать нужные части строк для дальнейшей обработки, производить замены и т. д.
    Знакомство с регулярными выражениями начнем с более простой технологии, служащей подобным целям - с подстановочных символов.
    Наверняка вы не раз выполняли команду dir, указывая ей в качестве аргумента маску файла, например *.exe. В данном случае звёздочка означает “любое количество любых символов”. Аналогично можно использовать и знак вопроса, он будет означать “один любой символ”, то есть dir ??.exe выведет все файлы с расширением .exe и именем из двух

    71 символов. В PowerShell можно применять и еще одну конструкцию –
    группы символов. Так например [a-f] будет означать “один любой символ от a до f, то есть (a,b,c,d,e,f)”, а [smw] любую из трех букв (s, m или w).
    Таким образом команда get-childitem [smw]??.exe выведет файлы с расширением .exe, у которых имя состоит из трех букв, и первая буква либо s, либо m, либо w.
    1.10.1 Оператор PowerShell -match
    Для начала изучения мы будем использовать оператор 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
    1.10.2 Использование групп символов
    В регулярных выражениях можно использовать и группы символов:
    PS C:\> Get-Process | where {$_.name -match "sy[ns]"} (рис.5)
    Рис.5-Использование групп символов
    И диапазоны в этих группах:
    PS C:\> "яблоко","апельсин","груша","абрикос" -match "а[а-п]" апельсин абрикос

    72
    В левой части оператора -match находится массив строк, и оператор соответственно вывел лишь те строки, которые подошли под регулярное выражение.
    Перечисления символов можно комбинировать, например группа
    [агдэ-я] будет означать “А или Г или Д или любой символ от Э до Я включительно”. Но гораздо интереснее использовать диапазоны для определения целых классов символов. Например [а-я] будет означать любую букву русского алфавита, а [a-z] английского. Аналогично можно поступать с цифрами – следующая команда выведет все процессы, в именах которых встречаются цифры:
    PS C:\> Get-Process | where {$_.name -match "[0-9]"} (рис.6)
    Рис.6- Процессы, в именах которых встречаются цифры
    Так как эта группа используется достаточно часто, для неё была выделена специальная последовательность – \d (от слова digit). По смыслу она полностью идентична [0-9], но короче.
    PS C:\> Get-Process | where {$_.name -match "\d"} (рис.7)
    Рис.7- Последовательность – \d (от слова digit).
    Так же последовательность была выделена для группы “любые буквы любого алфавита, любые цифры, или символ подчеркивания” эта группа обозначается как \w (от word) она примерно эквивалентна конструкции [a-zа-я_0-9] (в \w еще входят символы других алфавитов которые используются для написания слов).
    Другая популярная группа: \s – “пробел, или другой пробельный символ” (например символ табуляции). Сокращение от слова space. В большинстве случаев вы можете обозначать пробел просто как пробел, но эта конструкция добавляет читабельности регулярному выражению.
    Не менее популярной группой можно назвать символ . (точка). Точка в регулярных выражениях аналогична по смыслу знаку вопроса в подстановочных символах, то есть обозначает один любой символ.

    73
    Все вышеперечисленные конструкции можно использовать как отдельно, так и в составе групп, например [\s\d] будет соответствовать любой цифре или пробелу. Если вы хотите указать внутри группы символ -
    (тире/минус) то надо либо экранировать его символом \ (обратный слеш), либо поставить его в начале группы, чтобы он не был случайно истолкован как диапазон:
    PS C:\> "?????","Word","123","-" -match "[-\d]"
    123
    -
    1.10.3 Отрицательные группы и якоря
    Рассмотрим некоторые более
    “продвинутые” конструкции регулярных выражений.
    Предполагается, что вы уже знаете, как указать регулярному выражению, какие символы и/или их последовательности должны быть в строке для совпадения. А что если нужно указать не те символы, которые должны присутствовать, а те, которых не должно быть? То есть если нужно вывести лишь согласные буквы, вы можете их перечислить, а можете использовать и отрицательную группу с гласными, например:
    PS C:\> "a","b","c","d","e","f","g","h" -match "[^aoueyi]" b c d f g h
    "Крышка" в качестве первого символа группы символов означает именно отрицание. То есть на месте группы может присутствовать любой символ кроме перечисленных в ней. Для того чтобы включить отрицание в символьных группах (\d, \w, \s), не обязательно заключать их в квадратные скобки, достаточно перевести их в верхний регистр. Например \D будет означать "что угодно, кроме цифр", а \S "всё кроме пробелов"
    PS C:\> "a","b","1","c","45" -match "\D" a b c
    PS C:\> "a","-","*","c","&" -match "\W"
    -
    *
    &

    74
    Символьные группы позволяют указать лишь содержимое одной позиции, один символ, находящийся в неопределенном месте строки. А что если надо например выбрать все слова которые начинаются с буквы w?
    Если просто поместить эту букву в регулярное выражение, то оно совпадёт для всех строк, где w вообще встречается, и не важно – в начале, в середине или в конце строки. В таких случаях на помощь приходят "якоря". Они позволяют производить сравнение, начиная с определенной позиции в строке.
    ^ (крышка) является якорем начала строки, а $ (знак доллара) - обозначает конец строки.
    Не запутайтесь - ^ как символ отрицания используется лишь в начале группы символов, а вне группы - этот символ является уже якорем.
    Авторам регулярных выражений явно не хватало специальных символов, и они по возможности использовали их более чем в одном месте.
    Пример1. Вывод списка процессов, имена которых начинаются с буквы w:
    PS C:\> Get-Process | where {$_.name -match "^w"} (рис.8)
    Рис.8- Вывод списка процессов
    Эта команда вывела процессы, у которых сразу после начала имени
    (^) следует символ w. Иначе говоря, имя начинается на w. Для усложнения примера, и для упрощения понимания, добавим сюда “крышку” в значении отрицательной группы:
    PS C:\> Get-Process | where {$_.name -match "^w[^l-z]"} (рис.9)
    Рис.9-(^) следует символ w
    Теперь команда вывела процессы, у которых имя начинается с символа w, а следующий символ является чем угодно, только не символом из диапазона l-z.

    75
    Для закрепления опробуем второй якорь – конец строки:
    PS C:\> "Яблоки","Груши","Дыня","Енот","Апельсины","Персик" -match
    "[ыи]$"
    Яблоки
    Груши
    Апельсины
    Это выражение вывело нам все слова в которых последняя буква И или Ы.
    Если вы можете точно описать содержимое всей строки, то вы можете использовать и оба якоря одновременно:
    PS C:\> "abc","adc","aef","bca","aeb","abec","abce" -match "^a.[cb]$" abc adc aeb
    Это регулярное выражение выводит все строки, которые начинаются с буквы А, за которой следует один любой символ (точка), затем символ C или B и затем конец строки.
    Обозначения некоторых классов символов (метасимволы) приведены в (табл. 3).
    Таблица 3.
    Метасимволы, используемые в регулярных выражениях
    Метасим вол
    Описание метасимвола
    .(точка)
    Предполагает, что в конечном выражении на ее месте будет стоять любой символ. Продемонстрируем это на примере набора английских слов:
    1   2   3   4   5   6   7   8   9   10   ...   21


    написать администратору сайта