ЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л. Практикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01
![]()
|
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. Метасимволы, используемые в регулярных выражениях Метасим вол Описание метасимвола .(точка) Предполагает, что в конечном выражении на ее месте будет стоять любой символ. Продемонстрируем это на примере набора английских слов: |