- •Лабораторные работы Лабораторная работа №1. Файловая оболочка Midnight Commander
- •Лабораторная работа №2. Информационные команды оболочки, работа со справочной системой
- •Лабораторная работа №3. Управление каталогами
- •Лабораторная работа №4. Файловые операции
- •Лабораторная работа №5. Права доступа к файлам
- •Лабораторная работа №6. Организация поиска
- •Лабораторная работа №7. Регулярные выражения. Команда egrep
- •Лабораторная работа №8. Перенаправление стандартных потоков, конвейеры
- •Лабораторная работа №9. Фильтры, обработка текстовых данных
- •Лабораторная работа №10. Архивирование и сжатие
- •Лабораторная работа №11. Текстовый редактор Vim
- •Vim [ключи] [файл].
- •Лабораторная работа №12. Сценарии оболочки
- •Лабораторная работа №13. Условные конструкции
- •Лабораторная работа №14. Циклические конструкции
- •Лабораторная работа №15. Одномерные массивы
- •Лабораторная работа №16. Потоковый редактор sed
- •Лабораторная работа №17. Язык обработки шаблонов gawk
- •If (условие) {действия1} [else {действия2}].
Лабораторная работа №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 — выводить только те строки, в которых найдено совпадение целого слова с шаблоном.
Ход работы
Составьте и запишите регулярные выражения, соответствующие следующим строкам:
строка начинается на Fr;
строка содержит ровно 24 символов и заканчивается точкой;
хотя бы одно слово в строке начинается с большой буквы;
имеется слово, состоящее из цифр;
строка содержит время в формате мм:сс;
строка содержит дату в формате чч.мм (в месяце не более 31 дня);
строка содержит число от 1250 до 1990;
строка содержит число от 1960 до 2035;
строка содержит сумму долларов в виде $x или $xx (от 0 до 99).
С помощью текстового редактора 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.
Используя команду egrep, проверьте правильность составления регулярных выражений.
Создайте файлы с именами findhlp, grephlp и mounthlp, содержащие man-страницы команд find, egrep и mount соответственно. Выведите на экран:
строки, содержащие аббревиатуру ASCII;
пронумерованные строки, содержащие аббревиатуру ASCII;
имя файла(ов), содержащего фразу /mnt/cdrom;
имена файлов, не содержащие строк, в которых встречается отдельное слово access;
строки, не содержащие цифр.
Выведите информацию обо всех (в том числе скрытых) файлах домашнего каталога и всех его подкаталогах в файл logfile. Применяя команду egrep, выведите на экран строки, содержащие информацию
только о каталогах;
только о символических ссылках;
обо всех файлах, права доступа членов группы, в которую входит владелец, равны r-x;
о строках, содержащих набор символов <пробел>-><пробел>;
о строках, указывающих на файлы, которые не являются обычными.
Используя регулярные выражения и команду find с ключом –regex осуществите поиск:
в каталоге /dev поиск всех файлов, имена которых начинаются на tt, используя шаблоны имен файлов;
в каталоге /etc поиск всех файлов, имена которых состоят не менее, чем из 5 символов и второй символ находится в диапазоне от a до q.