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

  • Исходный набор строк

  • Пример 3. Подсчет файлов при помощи find и wc

  • 1.6.2 Отбрасывание ненужного

  • Пример 4. Извлечение отдельного поля

  • 1.6.3 Выбор нужного. Поиск

  • Пример 5. Поиск строки в выводе утилиты

  • Пример 6. Поиск ссылок в файле info

  • Пример 7. Замена символов (транслитерация)

  • 1.7 Потоковый редактор sed

  • Пример 8. Замена по регулярному выражению

  • Пример 9. Получение упорядоченного по частотности списка словоупотреблений

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


    Скачать 2.71 Mb.
    НазваниеПрактикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01
    Дата15.10.2022
    Размер2.71 Mb.
    Формат файлаpdf
    Имя файлаЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л.pdf
    ТипПрактикум
    #735270
    страница18 из 21
    1   ...   13   14   15   16   17   18   19   20   21
    Результат:
    127.0.0.1 255.255.255.255 1.23.099.255

    173
    Рассмотрим пример, связанный с выделением из текста электронных почтовых адресов (то есть адресов e-mail). Для начала определим все возможные варианты, которые должны быть отражены в регулярном выражении. Существует мнение, что не так сложно учесть все варианты, как не допустить, чтобы регулярное выражение соответствовало неправильному конечному тексту. Давайте определим все возможные варианты.
    Самым обычным считается адрес типа: username@foobarwebsite.com.
    Может показаться, что для выделения адреса e-mail будет достаточно такого регулярного выражения:
    \w+@\w+\.\w+
    Этого достаточно, чтобы распознать вышеуказанный формат адреса, но данное регулярное выражение не универсально. Следующий адрес корректен, однако вышеуказанное регулярное выражение распознать его не сможет: my.user.name@sub.foobar.website.com.
    В качестве тренировки подумайте, каким будет регулярное выражение. Ответ прост: чтобы регулярное выражение в данном случае было универсальным, следует учесть возможное наличие точек в имени пользователя и домена. Решение будет следующим:
    (\w+\ .) *\w+@ (\w+\ .)+\w+
    Это не совсем правильный вариант. В имени домена первого уровня могут быть только буквы, но не цифры или другие символы. В связи с этим можно изменить регулярное выражение следующим образом:
    (\w+\.)*\w+@(\w+\.) + [A-Za-z]+
    Продемонстрируем работу регулярного выражения на примере.
    Исходный набор строк: my@email.com another.my@email.com not.my@email.address.com wrong.address.com another.wrong.address.com
    Регулярное выражение:
    (\w+\.)*\w+@(\w+\.)+[A-Za-z]+
    Результат: my@email.com another.my@email.com not.my@email.address.com
    Закончим еще одним классическим примером — распознаванием адреса страницы в Интернете. Определим критерии, по которым будем искать адрес:
     в начале выражения может быть http://, https:// или www., причем последнее выражение, если оно существует, должно быть позже двух

    174 первых, a http:// и https:// не могут присутствовать одновременно; составными частями выражения могут быть буквы, цифры и знаки подчеркивания, причем эти составные части разделяются косыми чертами;
     в конце выражения может стоять косая черта или имя файла
    (выделяем только адрес страницы и не учитываем случай, когда передаются какие-либо параметры).
    На основе этого попытаемся составить регулярное выражение. Разобьем его на составляющие и посмотрим, что описывает каждая его часть (табл.
    4).
    Таблица 4.
    Части, составляющие адрес страницы
    Выражение Описание
    (https?://)?
    Здесь предположим, что в конечном тексте может быть http:// либо https://
    (www\.)?
    Предполагаем, что в конечном тексте может быть www
    (\w+\.) +
    С помощью этой фразы выделяются имена доменов второго и последующих уровней
    [A-Za-z]+
    Здесь выделяем имя домена первого уровня. Это не совсем верное решение, так как на данный момент существуют только домены первого уровня, длина которых не превышает четырех символов, и при пользовании этой фразой есть шанс вместе с адресами сайтов выделить «мусор»
    (/+\w+)*
    Предполагаем, что может быть также указан путь к определенному каталогу
    (\.\w+)?
    Здесь предполагаем, что в адресе может стоять имя файла. В этой фразе учитываем только возможность наличия расширения, так как само имя файла будет учтено предыдущей
    В результате получим регулярное выражение:
    (https?://) ?(www\.)?(\w+\.) + [A-Za-z] + (/ + \w+)* (\.\w+) ?
    Теперь, применив выражение к некоторому тексту, вы сможете выделить из него адреса страниц.
    1.6 Примеры задач
    Этот раздел посвящен нескольким примерам использования стандартных утилит для решения разных типичных (и не очень) задач.
    Примеры не следует воспринимать как исчерпывающий список возможностей, они приведены просто для демонстрации того, как можно организовать обработку данных при помощи конвейера. Чтобы освоить их, нужно читать руководства и экспериментировать.

    175
    1.6.1 Подсчет
    Часто бывает необходимо подсчитать количество определенных элементов текстового файла. Для подсчета строк, слов и символов служит стандартная утилита - wc
    (от англ. "word count" - "подсчет слов").
    Используя текстовый вывод утилит, можно посчитать свои файлы:
    Пример 3. Подсчет файлов при помощи find и wc
    [student@localhost root]$ find . | wc -l
    42
    Для подсчета файлов в примере использована команда find
    - инструмент поиска нужных файлов в системе. Команда find вызвана с одним параметром - каталогом, с которого надо начинать поиск. find выводит список найденных файлов по одному на строку, а поскольку критерии поиска в данном случае не уточнялись, то find просто вывела список всех файлов во всех подкаталогах текущего каталога. Этот список передан утилите wc для посчета количества полученных строк "
    -l
    ". В ответ wc выдала искомое число - "
    42
    ".
    Задав find критерии поиска, можно посчитать и что-нибудь менее тривиальное, например, файлы, которые создавались или были изменены в определенный промежуток времени, файлы с определенным режимом доступа, с определенным именем и т. п. Узнать обо всех возможностях поиска при помощи find и подсчета при помощи wc можно из руководств по этим программам.
    1.6.2 Отбрасывание ненужного
    Иногда пользователя интересует только часть из тех данных, которые собирается выводить программа. Утилита head нужна, чтобы вывести только первые несколько строк файла. Не менее полезна утилита tail
    (англ. "хвост"), выводящая только последние строки файла. Если же пользователя интересует только определенная часть каждой строки файла - поможет утилита cut
    Допустим, пользователю потребовалось получить список всех файлов и подкаталогов в "
    /etc
    ", которые принадлежат группе "
    adm
    ". При этом ему нужно, чтобы найденные файлы в списке были представлены не полным путем, а только именем файла (это требуется для последующей автоматической обработки полученного списка):
    Пример 4. Извлечение отдельного поля
    [student@localhost root]$ find /etc -maxdepth 1 -group adm 2> /dev/null \
    > | cut -d / -f 3 syslog.conf anacrontab
    Если команда получается такой длинной, что ее неудобно набирать в одну строку, можно разбить ее на несколько строк, не передавая системе:

    176 для этого в том месте, где нужно продолжить набор со следующей строки, достаточно поставить символ "
    \
    " и нажать
    Enter
    . При этом в начале строки bash выведет символ "
    >
    ", означающий, что команда еще не передана системе и набор продолжается. Вид этого приглашения определяется значением переменной окружения "
    PS2
    ". Для системы безразлично, в сколько строк набрана команда, возможность набора в несколько строк нужна только для удобства пользователя.
    Пользователь получил нужный результат, задав параметры find
    - каталог, где нужно искать и параметр поиска - наибольшую допустимую глубину вложенности и группу, которой должны принадлежать найденные файлы. Ненужные диагностические сообщения о запрещенном доступе он отправил в
    /dev/null
    , а потом указал утилите cut
    , что в полученных со
    стандартного ввода строках нужно считать разделителем символ "
    /
    " и вывести только третье поле. Таким образом, от строк вида "
    /etc/filename
    " осталось только "
    filename
    " Как уже указывалось, первым полем считается текст от начала строки до первого разделителя; в приведенном примере первое поле - пусто, "
    etc
    " - содержимое второго поля, и т. д.
    1.6.3 Выбор нужного. Поиск
    Зачастую пользователю нужно найти только упоминания чего-то конкретного среди данных, выводимых утилитой. Обычно эта задача сводится к поиску строк, в которых встречается определенное слово или комбинация символов. Для этого подходит стандартная утилита grep
    , которая может искать строку в файлах, а может работать как фильтр: получив строки со стандартного ввода, она выведет на стандартный
    вывод только те строки, где встретилось искомое сочетание символов. В следующем примере анализируются процессы bash
    , которые выполняются в системе:
    Пример 5. Поиск строки в выводе утилиты
    [student@ localhost root]$ ps aux | grep bash student 3459 0.0 3.0 2524 1636 tty2 S 14:30 0:00 -bash student 3734 0.0 1.1 1644 612 tty2 S 14:50 0:00 grep bash
    Первый аргумент команды grep
    - та строка, которую нужно искать в
    стандартном вводе, в данном случае это "
    bash
    ", а поскольку ps выводит сведения по строке на каждый процесс, на экран будут выведены только процессы, в имени которых есть "
    bash
    ". Однако неожиданно в списке выполняющихся процессов получены две строки, в которых встретилось слово "
    bash
    ", т. е. два процесса: один - искомый - командный интерпретатор bash
    , а другой - процесс поиска строки "
    grep bash
    ", запущенный после ps
    . Это произошло потому, что после разбора командной строки bash запустил оба дочерних процесса, чтобы организовать конвейер, и на момент выполнения команды ps процесс grep bash уже был запущен и тоже попал в вывод ps
    . Чтобы в этом примере

    177 получить правильный результат, необходимо добавить в конвейер еще одно звено:
    | grep -v grep
    , эта команда исключит из конечного вывода все строки, в которых встречается "
    grep
    ".
    1.6.4 Поиск по регулярному выражению
    Очень часто точно не известно, какую именно комбинацию символов нужно будет найти. Точнее, известно только то, как примерно должно выглядеть искомое слово, что в него должно входить и в каком порядке.
    Так обычно бывает, если некоторые фрагменты текста имеют строго определенный формат. Например, в руководствах, выводимых программой info
    , принят такой формат ссылок: "
    *Note название_узла::
    ". В этом случае нужно искать не конкретное сочетание символов, а "Строку "
    *Note
    ", за которой следует название узла (одно или несколько слов и пробелов), оканчивающееся символами "
    ::
    "". Утилита grep может выполнить такой запрос, если его сформулировать на языке регулярных выражений.
    Пример 6. Поиск ссылок в файле info
    [student@ localhost root]$ info grep > grep.info 2> /dev/null
    [student@ localhost root]$ grep -on "\*Note[^:]*::" grep.info
    324:*Note Grep Programs::
    684:*Note Invoking::
    [student@ localhost root]$
    Первый параметр grep
    , который взят в кавычки - это и есть
    регулярное выражение для поиска ссылок в формате info
    , второй параметр
    - имя файла, в котором нужно искать. Ключ "
    -o
    " заставляет grep выводить строку не целиком, а только ту часть, которая совпала с регулярным
    выражением (шаблоном поиска), а "
    -n
    " - выводить номер строки, в которой встретилось данное совпадение.
    В регулярном выражениибольшинство символов обозначают сами себя, как если бы мы искали обыкновенную текстовую строку, например,
    "
    Note
    " и "
    ::
    " в регулярном выражениисоответствуют строкам "
    Note
    " и "
    ::
    " в тексте. Однако некоторые символы обладают специальным значением, самый главный из таких символов - звездочка ("
    *
    "), поставленная после элемента регулярного выражения, обозначает, что могут быть найдены тексты, где этот элемент повторен любое количество раз, в том числе и ни одного, т. е. просто отсутствует. В нашем примере звездочка встретилась дважды: в первый раз нужно было включить в регулярное выражение именно символ "звездочка", для этого потребовалось лишить его специального значения, поставив перед ним "
    \
    " (см. раздел 1.5).
    Вторая звездочка обозначает, что стоящий перед ней элемент может быть повторен любое количество раз от нуля до бесконечности. В нашем случае звездочка относится к выражению в квадратных скобках - "
    [^:]
    ", что означает "любой символ, кроме "
    :
    "". Целиком регулярное выражение можно прочесть так: "Строка "
    *Note
    ", за которой следует ноль или больше

    178 любых символов, кроме "
    :
    ", за которыми следует строка "
    ::
    "". Особенность работы "
    *
    " состоит в том, что она пытается выбрать совпадение максимальной длины. Именно поэтому элемент, к которому относилась "
    *
    ", был задан как "не "
    :
    "". Выражение "ноль или более любых символов"
    (оно записывается как "
    .*
    ") в случае, когда, например, в одной строке встречается две ссылки, вбирает подстроку от конца первого "
    *Note
    " до начала последнего "
    ::
    " (символы "
    :
    ", поместившиеся внутри этой подстроки, распознаются как "любые").
    Регулярные выражения позволяют резко повысить эффективность работы, хорошо интегрированы в рабочую среду в системе Linux.
    1.6.5 Замены
    Удобство работы с потоком не в последнюю очередь состоит в том, что можно не только выборочно передавать результаты работы программ, но и автоматически заменять один текст другим прямо в потоке.
    Для замены одних символов другими предназначена утилита tr
    (сокращение от англ. "translate" - "преобразовывать, переводить"), работающая как фильтр. В примере 7.7 утилита применена прямо по назначению – с ее помощью выполнена транслитерация - замена латинских
    символов близкими по звучанию русскими:
    Пример 7. Замена символов (транслитерация)
    [student@ localhost root]$ cat cat.info | tr abcdefghijklmnopqrstuvwxyz абцдефгхийклмнопкрстуввсиз \
    > | tr ABCDEFGHIJKLMNOPRSTUVWXYZ
    АБЦДЕФГХИЙКЛМНОПКРСТУВВСИЗ | head -4
    Филе: цореутилс.инфо, Ноде: цат инвоцатион, Нест: тац инвоцатион,
    Тп: Оутпут оф ентире филес 'цат': Цонцатенате анд врите филес
    ………
    [student@ localhost root]$
    Два параметра для утилиты tr
    : соответствия латинских букв кириллическим. Первый символ из первого параметра tr заменяет первым
    символом второго, второй - вторым и т. д. Пользователь обработал поток
    фильтром tr дважды: сначала чтобы заменить строчные буквы, а затем - прописные. Он мог бы сделать это и за один проход (просто добавив к параметрам прописные после строчных), но не захотел выписывать столь длинные строки. Полученному на выходе тексту вряд ли можно найти практическое применение, однако транслитерацию можно употребить и с пользой. Если не указать tr второго параметра, то все символы, перечисленные в первом, будут заменены на "ничто", т. е. попросту удалены из потока. При помощи tr можно также удалить дублирующиеся
    символы (например, лишние пробелы или переводы строки), заменить пробелы переводами строк и т. п.

    179
    1.7 Потоковый редактор
    sed
    Помимо простой замены отдельных символов, возможна замена последовательностей (слов). Специально для этого предназначен потоковый редактор sed
    (сокращение от англ. «stream editor»). Он работает как фильтр и выполняет редактирование поступающих строк: замену одних последовательностей символов другими, причем можно заменять и регулярныевыражения.
    Например, с помощью sed можно сделать более понятным для непривычного читателя список файлов, выводимый ls
    :
    Пример 8. Замена по регулярному выражению
    [student@ localhost root]$ ls –l | sed s/^-[-rwx]*/Файл:/ | sed s/^d[- rwx]*/Каталог:/ итого 124
    Файл: 1 student 2693 Ноя 15 16:09 cat.info
    Файл: 1 student 69 Ноя 15 16:08 cat.stderr
    Каталог: 2 student 4096 Ноя 15 12:56 Documents
    Каталог: 3 student 4096 Ноя 15 13:08 examples
    Файл: 1 student 83459 Ноя 15 16:11 grep.info
    Файл: 1 student 26 Ноя 15 13:08 loop
    Файл: 1 student 23 Ноя 15 13:08 script
    Файл: 1 student 33 Ноя 15 16:07 textfile
    Каталог: 2 student 4096 Ноя 15 12:56 tmp
    Файл: 1 student 32 Ноя 15 13:08 to.sort
    [student @ localhost root]$
    У sed очень широкие возможности, но довольно непривычный синтаксис, например, замена выполняется командой
    «
    s/что_заменять/на_что_заменять/
    ». Чтобы в нем разобраться, нужно обязательно прочесть руководство sed(1)
    и знать регулярные выражения.
    1.8 Упорядочивание
    Для того чтобы разобраться в данных, нередко требуется их упорядочить: по алфавиту, по номеру, по количеству употреблений.
    Основной инструмент для упорядочивания - утилита sort
    . Рассмотрим ее использование в сочетании с несколькими другими утилитами:
    Пример 9. Получение упорядоченного по частотности списка
    словоупотреблений
    [student@ localhost root]$ cat grep.info | tr "[:upper:]" "[:lower:]" | tr
    "[:space:][:punct:]" "\n" \
    > | sort | uniq -c | sort -nr | head -8 15233

    180 720 the
    342 of
    251 to
    244 a
    213 and
    180 or
    180 is
    [student@ localhost root]$
    В примере 7.9 выполняется подсчет, сколько раз какие слова были употреблены в файле "
    grep.info
    " и вывод самых часто употребляемых с указанием количества употреблений в файле. Для этого потребовалось сначала заменить все большие буквы маленькими, чтобы не было разных способов написания одного слова, затем заменить все пробелы и знаки препинания концом строки (символ "
    \n
    "), чтобы в каждой строке было ровно по одному слову (пользователь всюду взял параметры tr в кавычки, чтобы bash не понял их неправильно). Потом список был отсортирован, все повторяющиеся слова заменены одним словом с указанием количества повторений ("
    uniq -c
    "), затем строки снова отсортированы по убыванию чисел в начале строки ("
    sort -nr
    ") и выведены первые 8 строк ("
    head -8
    ").
    2 МЕТОДИКА ВЫПОЛНЕНИЯ
    1. Используя утилиты hexdump и strings, вывести на экран содержимое одного из перечисленных ниже файлов из каталога /bin. Позиция файла для распечатки определяется номером бригады. Имена файлов для выполнения задания 1: tar, sort, sed, ping, vi, unlink, uname, touch, sleep, sty.
    2. Подсчитать общее количество файлов (каталогов) в одном из перечисленных ниже каталогов. Каталог для подсчета количества определяется номером бригады. Имена каталогов для выполнения задания 2:
    /bin, /etc, /lib, /proc, /usr, /var, /dev, /sbin, /sys, /root
    3. Найти общее количество процессов, выполняющихся в системе в данный момент.
    4. Вывести список выполняющихся процессов, в именах которых присутствует слово manager и отсутствует слово grep
    5. Создать текстовый файл, содержащий набор строк вида:
    123 178 176 755 713 873

    181
    С помощью утилиты grep найти строки, в которых есть цифра 7, после которой находится одна из цифр — 1, 3 или 5.
    6. Создать текстовый файл, содержащий набор строк вида: starfish starless samscripter stellar microsrar ascender sacrifice scalar
    С помощью утилиты grep найти строки, начинающиеся на букву s и заканчивающиеся на букву r
    7. Создать текстовый файл, содержащий простейшие адреса электронной почты вида username@website.com.
    С помощью утилиты grep найти строки, содержащие правильные простейшие адреса. Проверить возможность использования более сложного регулярного выражения для распознавания адресов, содержащих другие допустимые символы.
    8. На произвольном примере продемонстрировать работу утилиты tr
    Создать текстовый файл, содержащий допустимые и недопустимые IP- адреса, например 127.0.0.1 255.255.255.255 12.34.56 123.256.0.0 1.23.099.255 0.79.378.111
    С помощью утилиты grep и руководства man найти строки, содержащие допустимые четырехбайтовые IP адреса.
    9. Создать текстовый файл, содержащий корректные и некорректные номера телефонов ведомственной АТС объемом 399 номеров, номера с 000 до 399 – корректные, 0, 400, 900 –некорректные.
    С помощью утилиты grep и руководства man найти строки, содержащие допустимые номера телефонов.
    1   ...   13   14   15   16   17   18   19   20   21


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