Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СППО - Лабораторные работы.doc
Скачиваний:
22
Добавлен:
10.11.2019
Размер:
752.13 Кб
Скачать

Лабораторная работа №7. Регулярные выражения. Команда egrep

Цель работы: освоить принципы составления базовых и расширенных регулярных выражений и их использование в команде egrep.

Используемые наборы регулярные выражения отличаются от приложения к приложению. Выделяют:

  • базовые регулярные выражения, которые во всех программах обрабатываются одинаково.

  • расширенные регулярные выражения, используемые, например, в команде egrep.

  • регулярные выражения perl. Используются при написании скриптов на языке Perl.

Регулярное выражение представляет собой набор символов, некоторые из которых имеют специальное значение (являются метасимволами). В шаблонах расширенных регулярных выражений используются следующие метасимволы (представлены как базовые, так и расширенные).

Символ

Описание

Пример

. (точка)

Любой одиночный символ

c.t — «cat», «cut», но не «ct» и не «c.t»

^ (циркумфлекс)

Начало строки

^Computer — все строки, начинающиеся со слова «Computer», но не с «computer»

$

Конец строки

Memory$ — все строки, оканчивающиеся на слово «memory», но не на «memory.»

*

Предыдущий символ встречается 0 и более число раз подряд

200*9 — «209», «2009», «20009», но не «20019» и «20099»

+

Предыдущий символ встречается 1 и более число раз подряд

200+9 — «2009», «20009», «200009», но не «209» и «20099»

?

Предыдущий символ встречается ровно 1 раз

200?9 — «2009»

\символ

Экранирование спецсимволов: $ . ' " * [ ] ( ) ^ | \ + ?

error\.$ — все строки, оканчивающиеся на «error.», но не на «error»

[список]

Диапазон символов; для удобства элементы списка можно разделять запятыми

[Aa][B,b][0-9] — «ab1», «aB5», но не «Aa1», «aB»

[^список]

Символы, не соответствующие списку

[^a-zA-Z] — любой символ, кроме буквы

[список]*

Список может повторяться неопределенное количество раз

[a-z,A-Z]* — любое слово

шаблон\{n\}

Шаблон встречается ровно n раз подряд

x\{3\}y — последовательность «xxxy»

шаблон\{n,\}

Шаблон встречается не менее n раз подряд

x\{3,\}y — «xxxy», «xxxxy», «xxxxxy», но не «xxy»

шаблон\{,n\}

Шаблон встречается не более n раз подряд

x\{,3\}y — «xy», «xxy», «xxxy», но не «y», «xxxxy»

шаблон\{n,m\}

Шаблон встречается не менее n и не более m раз подряд

x\{2,4\}y — «xxy», «xxxy», «xxxxy», но не «xy» или «xxxxxy»

(шабл1|шабл2)

шабл1 или шабл2

([Oo]ne|[Tt]wo) — одно из слов «one», «One», «two», «Two»

При задании явного количества повторений числа n и m могут принимать значения от 0 до 255. Кроме указанных метасимволов возможно применение классов (см.п.Error: Reference source not found). Для указания на начала и конца слова применяются конструкции вида \< и \> соответственно (под словом понимается набор символов строки между разделителями).

Некоторые полезные примеры регулярных выражений:

^[^l] — исключает строки, начинающиеся не с l;

^$ — пустая строка;

^.$ — строка из одного символа;

^…$ — строка из любых трех символов;

^.*$ — строка из любого числа символов;

[a-z][a-z]* — по крайней мере, одна строчная буква;

\<"word"\> — слово word в кавычках;

\<"*word"*\> — слово word в кавычках или без них;

"[^"]" — строка в кавычках;

(1[012]|[1-9]):[0-5][0-9]?(am|pm) — время в формате 7:15am или 07:15pm.

[01]?[09]|2[0-3]:[0-5][0-9] — время в 24-часовом формате c удалением или без лидирующих нолей при указании часов (1:23 или 01:23)

Общий формат команды egrep:

egrep [опции] [шаблон] [файлы] — ищет в указанных файлах строки, соответствующие шаблону. Если имена файлов не заданы, строки ищутся в стандартном вводе. По умолчанию egrep выводит совпадающие строки на стандартный вывод. В качестве шаблона выступают регулярные выражения.

Внимание! Сравнение строк происходит с целым шаблоном, то есть, при указании в качестве шаблона abcd, фактически будет происходить сравнение с регулярным выражением ^abcd$.

Опции команды egrep:

-c — для каждого входного файла вместо обычного вывода печатать количество совпавших строк;

-i — игнорировать регистр символов (как в шаблоне, так и во входящих файлах);

-l — печатать имена файлов, в которых был найден шаблон;

-L — печатать имена файлов, в которых не был найден шаблон;

-n — выводить номера строк и сами строки, соответствующие шаблону;

-r — обрабатывать все файлы каждого каталога рекурсивно;

-v — выводить строки, не соответствующие шаблону;

-x — выводить только те строки, которые полностью совпали с шаблоном;

-w — выводить только те строки, в которых найдено совпадение целого слова с шаблоном.

Ход работы

  1. Составьте и запишите регулярные выражения, соответствующие следующим строкам:

  • строка начинается на Fr;

  • строка содержит ровно 24 символов и заканчивается точкой;

  • хотя бы одно слово в строке начинается с большой буквы;

  • имеется слово, состоящее из цифр;

  • строка содержит время в формате мм:сс;

  • строка содержит дату в формате чч.мм (в месяце не более 31 дня);

  • строка содержит число от 1250 до 1990;

  • строка содержит число от 1960 до 2035;

  • строка содержит сумму долларов в виде $x или $xx (от 0 до 99).

  1. С помощью текстового редактора mcedit cоздайте текстовый файл следующего содержания:

Post: July 17, 2010, 12:24

From: John Walker

Dear Michael! You can receive you posts at:

july 18, post number: 1988

19.07 or 20.07 from 11:30 to 14:45

Total numbers of posts: 2020

Best regards, PostRobot.

  1. Используя команду egrep, проверьте правильность составления регулярных выражений.

  2. Создайте файлы с именами findhlp, grephlp и mounthlp, содержащие man-страницы команд find, egrep и mount соответственно. Выведите на экран:

  • строки, содержащие аббревиатуру ASCII;

  • пронумерованные строки, содержащие аббревиатуру ASCII;

  • имя файла(ов), содержащего фразу /mnt/cdrom;

  • имена файлов, не содержащие строк, в которых встречается отдельное слово access;

  • строки, не содержащие цифр.

  1. Выведите информацию обо всех (в том числе скрытых) файлах домашнего каталога и всех его подкаталогах в файл logfile. Применяя команду egrep, выведите на экран строки, содержащие информацию

  • только о каталогах;

  • только о символических ссылках;

  • обо всех файлах, права доступа членов группы, в которую входит владелец, равны r-x;

  • о строках, содержащих набор символов <пробел>-><пробел>;

  • о строках, указывающих на файлы, которые не являются обычными.

  1. Используя регулярные выражения и команду find с ключом –regex осуществите поиск:

  • в каталоге /dev поиск всех файлов, имена которых начинаются на tt, используя шаблоны имен файлов;

  • в каталоге /etc поиск всех файлов, имена которых состоят не менее, чем из 5 символов и второй символ находится в диапазоне от a до q.