C одержани е


РАЗДЕЛ 2. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ КАК СРЕДСТВА ТЕКСТОВОГО ПОИСКА



страница2/6
Дата01.12.2017
Размер1.09 Mb.
ТипКонтрольные вопросы
1   2   3   4   5   6
РАЗДЕЛ 2. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ КАК СРЕДСТВА ТЕКСТОВОГО ПОИСКА
2.1. Основные понятия и возможности

При работе в ОС UNIX или ОС Linux часто используются регулярные выражения (regular expression, regexp) - механизм, позволяющий задать шаблон для строки и осуществить поиск данных, соответствующих этому шаблону в заданном тексте. Сутью механизма регулярных выражений является то, что они позволяют задать шаблон для нечеткого поиска по тексту. Регулярные выражения и методы работы с ними используются в shell-програм­мировании, что позволяет повысить качество создаваемых сценариев - во многих случаях три-четыре команды фильтрации текста можно заменить одной командой с регулярным выражением.

Регулярные выражения можно применять для фильтрации текстовых файлов или выходных данных команды либо сценария. Они представляют собой набор шаблонов, состоящих как из специальных, так и обычных символов, т.е. строка, которая всегда начинается с символа разделителя, за которым следует непосредственно регулярное выражение, затем еще один символ разделителя и затем необязательный список модификаторов. В качестве символа разделителя обычно используется слэш ('/'). Например, в регулярном выражении: /\d{4}-\d{2}/m, символ '/' является разделителем, строка '\d{4}-\d{2}' - непосредственно регулярным выражением, а символ 'm', расположенный после второго разделителя - это модификатор.

Регулярные выражения в той или иной форме используются всеми основными текстовыми редакторами и утилитами, выполняющими фильтрацию текста. К сожа­лению, наборы поддерживаемых выражений несколько различаются от программы к программе, но существуют так называемые базовые регулярные выражения, которые во всех программах обрабатываются одинаково. Единственное исключение — оператор \{ \}, который поддержи­вается в программах sed и grep, но не поддерживается в awk.



2.2. Создание шаблонов для поиска выражений, стоящих в начале или в конце строки

2.2.1. Метасимволы и операторы базовых регулярных выражений

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

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

^ - соответствует началу строки;

$ - соответствует концу строки;

[ ] - соответствует любому символу из числа заключенных в скобки, например, чтобы задать диапазон символов от 1 до 5, следует указать первый символ диапазона, дефис и последний символ [1-5]) вместо шаблона [12345];

[^ ] - соответствует любому символу, кроме тех, что указаны в скобках;

\ - отменяет специальное значение следующего за ним метасимвола;

. - соответствует любому отдельному символу;

* - указывает на то, что предыдущий шаблон встречается ноль или более раз. В программах awk и egrep, где используются расширенные регуляр­ные выражения, существует два дополнительных оператора:

? - предыдущий шаблон встречается не более одного раза;

+ - предыдущий шаблон встречается один или более раз;

\{n\} - предыдущий шаблон встречается ровно п раз ;

\{n,\} - предыдущий шаблон встречается не менее п раз;

\{,m\} - предыдущий шаблон встречается не более т раз;

\{n,m\} - предыдущий шаблон встречается не менее п раз и не более т раз.



2.2.2. Поиск одиночных символов с помощью метасимвола '.'

Метасимвол '.' соответствует любому одиночному символу. Если, например, требуется найти слово, начинающееся с подстроки "beg", после которой стоит произвольный символ, а за ним — символ 'n', задайте шаблон beg.n. Будут найдены такие слова, как "begin", "began" и т.д.

Данный метасимвол удобно применять при фильтрации результатов работы команды ls -l для поиска файлов, имеющих требуемые права доступа: например, шаблон, соответствующий файлам, право на исполнение которых есть у всех пользователей:

...х..х..х

Примеры отбора строк режима по этому шаблону приведены ниже:



-rwxrwxr-x

-rwxr-xr-x

Предположим, выполняется фильтрация текстового файла. Необходимо найти строки, состоящие из десяти символов, из которых пятый и шестой символы - "ХС". Данная задача решается с помощью такого шаблона:

.XC….

Он означает, что первые четыре символа могут быть произвольными, следующие два - "ХС", а последние четыре могут быть произвольными. Вот несколько примеров сравнения:



1234ХС9088 – соответствует заданному шаблону,

4523ХХ9001 - не соответствует заданному шаблону,

0011ХА9912 - не соответствует заданному шаблону,

9931ХС3445 - соответствует заданному шаблону.

2.2.3. Поиск выражений в начале строки с помощью метасимвола '^'

Метасимвол '^' позволяет искать слова или символы, стоящие в начале строки. Например, благодаря шаблону ^d можно отобрать из списка, выводимого командой ls -1, только те записи, которые соответствуют каталогам:



drwxrwxrw- - соответствует заданному шаблону,

-rw-rw-rw- - не соответствует заданному шаблону,

drwxrwxr-x - соответствует заданному шаблону,

-rwxr-xr-x - не соответствует заданному шаблону.

Для поиска строк, у которых в четвертой позиции от начала стоит символ '1', можно воспользоваться следующим шаблоном:



^... 1

В результате получим:



1234ХС9088 - не соответствует;

4523ХХ9001 - не соответствует;

0011ХА9912 - соответствует;

9931ХС3445 - соответствует.

Чтобы найти строки, начинающиеся с символов "соmр", следует указать: ^comp

В регулярном выражении можно сочетать различные шаблоны поиска. Предположим, после символов "comp" могут идти любые две буквы, но завершать должны символы "ing":

^соmр..ing

Этот шаблон обеспечивает поиск таких слов, как "computing", "complaining" и т.д.



2.2.4. Поиск выражений в конце строки с помощью метасимвола '$'

Метасимвол '$' предназначен для поиска слов или символов, находящихся в конце строки. Он указывается в конце шаблона. Предположим, требуется найти строки, заканчивающиеся словом "trouble". Эту задачу позволяет решить шаблон:



trouble$

Следующий шаблон соответствует пустой строке, не содержащей символов: ^S

А с помощью показанного ниже шаблона можно найти строки, включающие только один символ: ^.s

2.3. Создание шаблонов для поиска символов, встречающихся неопределенное число раз

Метасимвол '*' означает, что предыдущий символ в регулярном выражении либо отсутствует, либо встречается произвольное число раз подряд (1, 2 и т.д.). Например, шаблон соmрu*t отвечает таким словам:



сomputer,

computing,

compuuuuute,

шаблон 10133* соответствует следующему:



101333

10133

10134
2.4. Создание шаблонов для поиска специальных символов

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



$ / ‘ “ * [ ] ^ | ( ) \ + ?

Когда требуется найти строку, содержащую один из таких символов, его необходимо "защитить" в шаблоне с помощью обратной косой черты, которая отменяет специальное значение следующего за ней метасимвола. Предположим, строка содержит символ '.', который, как известно, в регулярном выражении соответствует произвольному символу, шаблон для него: \.

Если необходимо найти файлы, допустим, с расширением xls, можно применить следующий шаблон:

\*\.xls

2.5. Создание шаблонов для поиска символов из указанного набора или диапазона

Шаблон [ ] соответствует списку или диапазону символов, указанных в квадратных скобках. Символы в списке можно разделять запятыми, что облегчает восприятие шаблона, хотя и не является обязательным требованием.

Для задания диапазона символов используется дефис (-). Слева от него указыва­ется первый символ диапазона, а справа - последний. Предположим, необходимо найти символ, являющийся цифрой. Можно применить такой шаблон:

[0123456789].

Однако проще задать диапазон: [0-9].

Следующий шаблон соответствует любой строчной букве: [a-z]. Чтобы найти любую букву произвольного регистра, следует воспользоваться шаблоном [A-Za-z]. Здесь формируется список из двух диапазонов: прописные буквы от 'А' до 'Z' и строчные буквы от 'а' до 'z'.

Представленный ниже шаблон соответствует любому алфавитно-цифровому символу:



[A-Za-zO-9].

Шаблон, предназначенный для поиска трехсимвольных комбина­ций следующего типа: в начале находится буква 's', за ней может следовать любая прописная или строчная буква, а завершает последовательность буква 't', записывается следующим образом:



s[a-zA-Z]t

Если же комбинация состоит только из букв нижнего регистра, следует воспользоваться шаблоном:



s[a-z]t .

Чтобы найти слово "computer" независимо от того, расположено оно в начале предложения или нет, можно применить шаблон:



[Cc|omputer

Следующий шаблон соответствует слову "system", которое начинается с пропис­ной или строчной буквы и за которым следует точка: [S,s|ystem\. Запятая в квадратных скобках поставлена для того, чтобы сделать шаблон удобным для зрительного восприятия.

Метасимвол '*', размещенный после квадратных скобок, указывает на то, что символы в скобках могут повторяться неопределенное число раз. Например, следую­щий шаблон соответствует любому слову:

[A-Za-z]*

Метасимвол '^' после открывающей квадратной скобки - признак того, что шаблон соответствует любым символам, кроме указанных в скобках. Так, шаблон [^a-zA-Z] соответствует всем символам, кроме букв, а шаблон [^0-9] отвечает всем символам, которые не являются числами.



2.6. Поиск символов, встречающихся заданное число раз

Метасимвол '*' позволяет находить символы, встречающиеся несколько раз подряд, но число повторений при этом не определяется. Если же необходимо в процессе поиска учитывать точное количество последовательных вхождений символа в строку, следует применить шаблон \{ \}.

Существует четыре варианта этого шаблона:

1) \ {n\ } - символы встречаются ровно п раз подряд;

2) \ {n, \} - символы встречаются не менее п раз подряд;

3) \{, m\} - символы встречаются не более т раз подряд;

4) \ {n,m\} - символы встречаются не менее п и не более т раз подряд, где п и т — целые числа из интервала от 0 до 255.

Представленный ниже шаблон соответствует последовательности из двух букв 'А', за которыми следует буква 'В':



А\{2\}В

В результате получим "ААВ".

В следующем шаблоне задано, что буква 'А' встречается не менее четырех раз подряд:

А\{4,\)В

Возможные результаты поиска -"ААААВ" или "АААААААВ", но не "АААВ". Поиск последовательности, в которой буква 'А' встречается от двух до четырех раз, выполняется по такому шаблону:



А\{2,4\}В

Будут найдены строки "ААВ", "АААВ", "ААААВ", но не "АВ" или "АААААВ".

Допустим, в ранее рассмотренном примере фильтрации текстового файла требуется найти строки, в которых первые четыре символа цифры, за ними идут символы "XX", а затем еще четыре цифры. Решить данную задачу позволит шаблон:

[0-9]\{4\}ХХ[0-9]\{4\}

Применив этот шаблон к рассмотренному фрагменту, получим:



1234ХС9088 - не соответствует;

4523XX9001 - соответствует;

0011ХА9912 - не соответствует;

9931ХС3445 - не соответствует.

2.7. Инструментальное средство grep

Команда grep (global regular expression print - печать глобальных регулярных выражений) является наиболее известным инструментальным средством в UNIX и Linux. Она выполняет в текстовых файлах или стандартном входном потоке поиск выражений, соответствующих шаблону, с последующим отображением результата на экране. Команда grер может работать как с базовыми, так и с расширенными регулярными выражениями. Существует три разновидности этой команды:

grep - стандартный вариант, которому уделено основное внимание в данной главе;

еgrep - работает с расширенными регулярными выражениями (не поддерживает только оператор \ { \ });

fgrер - быстрый вариант команды grер. Вместо поиска выражений, соответст­вующих шаблону, выполняет поиск фиксированных строк из указанного списка. Несмотря на название "быстрый" это наиболее медленная из команд семейства grер.

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



2.7.1. Команда grep

Общий формат команды grep следующий:



grep [параметры) базовое_регулярное_выражение [файл]

В качестве регулярного выражения может быть указана обычная строка. Если файл не указан, текст берется из стандартного входного потока.

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

Если образец поиска состоит из какой-нибудь системной переменной, например $РАТН, рекомендуется тоже взять ее в двойные кавычки. Это связано с тем, что, прежде чем передавать аргументы команде grep, интерпретатор shell выполняет подстановку переменных, и команда grep получает значение переменной, которое может содержать пробелы. В этом случае будет выдано то же сообщение об ошибке, о котором говорилось в предыдущем абзаце.

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

Команда grep имеет следующие параметры:

-с - задает отображение только числового значения, указывающего, сколько строк соответствуют шаблону;

-i - дает указание игнорировать регистр символов;

-h - подавляет вывод имен файлов, включающих найденные строки (по умолчанию в выводе команды grep каждой строке предшествует имя файла, в котором она содержится);

-1 - задает отображение только имен файлов, содержащих найденные строки;

-n - задает нумерацию выводимых строк;

-s - подавляет вывод сообщений о несуществующих или нетекстовых файлах;

-v - задает отображение строк, не соответствующих шаблону.



Поиск среди нескольких файлов

Если в текущем каталоге требуется найти последовательность символов "sort" во всех файлах с расширением doc, следует ввести команду:



grep sort *.doc

Следующая команда осуществляет поиск фразы "sort it" во всех файлах текущего каталога:



grep "sort it" *

В рассматриваемых ниже примерах будет использоваться файл с именем data.f, содержащий информацию о заказах товаров. Структура записи этого файла следующая:

1-й столбец — код города;

2-й столбец — код месяца, когда был сделан заказ;

3-й столбец — код заказа, включающий год, когда он был сделан;

4-й столбец — код товара;

5-й столбец — цена за единицу товара;

6-й столбец — код фирмы;



7-й столбец — количество заказанного товара.

$ cat data f



















48 dec

3BC1997

LPSX

68.

00

LVX2A

138

483 sept

5AP1996

USP

65.

00

LVX2C

189

47 oct

3ZL1998

LPSX

43.

00

KVM9D

532

219 dec

2CC1999

CAD

23

00

PLV2C

68

484 nov

7PU996

CAD

49.

00

PLV2C

234

483 may

5PA1998

USP

37.

00

KVM9D

644

216 sept 3ZL1998 USP 86. 00 KVM9E 234

Разделителем полей является символ табуляции



Определение числа строк, в которых найдено совпадение

Опция -с позволяет узнать, сколько строк соответствуют заданному шаблону. Это может оказаться полезным в том случае, когда команда grep находит слишком много строк, и их лучше вывести в файл, а не на экран. Рассмотрим пример:



gpep -с "48" data.f

Команда grep возвращает число 4. Это означает, что в файле data.f обнаружены 4 строки, содержащие последовательность символов "48". Следующая команда ото­бражает эти строки:



$ grep "48" data.f

48 dec 3BC1997 LPSX 68.00 LVX2A 138

483 sept 5AP1996 USP 65.00 LVX2C 189

484 nov 7PL1996 CAD 49.00 PLV2C 234

483 may 5PA1998 USP 37.00 KVM9D 644

Вывод номеров строк

С помощью опции -n выводимые строки можно пронумеровать. В результате можно с легкостью устанавливать, в какой позиции файла находится требуемая строка. Например, после ввода команды:



grep -n "48" data.f

на экран будет выведена следующая информация:



1:48 dec 3BC1997 LPSX 68.00 LVX2A 138

2:483 sept. 5AP1996 USP 65.00 LVX2C 189

5:484 nov 7PL1996 CAD 49.00 PLV2C 234

6:483 may 5PA1998 USP 37.00 KVM9D 644

Номера строк отображаются в первом столбце.



Поиск строк, не соответствующих шаблону

Благодаря опции -v можно отобрать те строки, которые не соответствуют шаб­лону. Следующая команда извлекает из файла data.f строки, не содержащие последо­вательность символов "48":



grep -v "48" data.f

Результат выполнения команды:



47 oct 3ZL1998 LPSX 43.00 KVM9D 512

219 dec 2CC1999 CAD 23.00 PLV2C 68

216 sept 3ZL1998 USP 86.00 KVM9E 234

Поиск символов на границе слов

При поиске строк, содержащих последовательность символов "48", были найдены строки заказов с кодом города не только 48, но также 483 и 484. Если необходимо найти заказ, у которого код города равен 48, необходимо добавить в шаблон поиска символ табуляции:



grep "48" data.f

Здесь запись означает нажатие клавиши [Tab].

Тогда результат выполнения команды будет следующий:

48 Dec 3BC1997 LPSX 68.00 LVX2A 138

Если не известно, какой пробельный символ является разделителем полей в файле, можно воспользоваться регулярным выражением \ > - признаком конца слова:



grep '48\>' data.f

Результат выполнения команды:


48 Dec 3BC1997 LPSX 68.00 LVX2A 138

Игнорирование регистра символов

По умолчанию команда grep чувствительна к изменению регистра символов. Для выполнения поиска без учета регистра используется опция -i. В файле data.f обозначение месяца Sept встречается как в верхнем, так и в нижнем регистре. Поэтому для отбора строк обоих видов следует применить такую команду:



$ grep -i "sept" data.f

Результатами поиска будут нижеприведенные строки:



483 Sept 5AP1996 USP 65.00 LVX2C 189

216 sept 3ZL1998 USP 86.00 KVM9E 234

Команда grep и регулярные выражения

С помощью регулярных выражений можно задавать более сложные критерии фильтрации информации. При работе с регулярными выражениями следует заклю­чать шаблон поиска в одинарные кавычки - это позволит защитить все встречающиеся в нем специальные символы. В противном случае интерпретатор shell может "перехватывать" их у команды grep.



Выбор символов из списка

Предположим, требу­ется извлечь из файла data.f строки заказов, сделанных в городах, код которых равен 483 или 484. Поставленную задачу решает следующая команда:



grep '48[34]' data.f

Выбранные строки:



483 Sept 5AP1996 JSP 65.00 LVX2C 189

484 nov 7PL1996 CAD 49.00 PLV2C 234

483 may 5PA1998 USP 37.00 KVM9D 644

Инверсия шаблона с помощью метасимвола '^'

Выполнить в файле data.f поиск cтрок, не начинающихся с заданных символов, например, цифры 4 или 8, можно, используя команду:



grep ' ^[^48] ' data.f

Символ '^' заключенный в квадратные скобки, говорит о том, что шаблон соответствует любому символу, кроме цифр 4 и 8. Символ '^' в начале шаблона - признак того, что поиск производится с начала каждой строки.

Результатом будут следующие строки:

219 dec 2CC1999 CAD 23.00 PLV2C 68

216 sept 3ZL1998 USP 86.00 KVM9E 234

Шаблон, соответствующий любому символу

Предположим, в файле data.f требуется найти коды фирм, которые начинаются на букву 'K' и заканчиваются буквой 'D'. Реализуется это следующим образом:



grep 'K...D' data.f

Данный шаблон рассчитан на то, что коды фирм в файле состоят из пяти символов:


47 Oct 3ZL1998 LPSX 43.00 KVM9D 512

483 may 5PA1998 ' USP 37.00 KVM9D 644

Ниже представлена небольшая вариация вышеприведенного примера. На этот раз осуществляется поиск всех кодов со следующей структурой: первые два символа - буквы в верхнем регистре, далее следуют два произвольных символа, а завершает последовательность буква 'С':



grep '[A-Z] [A-Z]..С' data.f

Выбранные строки:



483 Sept 5AP1996 USP 65.00 LVX2G 189

219 dec 2CC1999 CAD 23.00 PLV2C 68

484 nov 7PL1996 CAD 49.00 PLV2C 234

Поиск по дате

Представленная ниже команда находит все заказы, которые были сделаны в 2010 или 2011 году и коды которых начинаются с цифры 5:



grep '5. .201[01] ' data.f

Пример результата выполнения команды:



483 Sept 5AP2010 USP 65.00 LVX2C 189

483 may 5PA2011 USP 37,00 KVM9D 644

Структура используемого здесь шаблона такова: первым символом является цифра 5, за ней следует два произвольных символа, затем число 201, а последним символом может быть либо цифра 0, либо цифра 1.

Поиск всех заказов, сделанных в 2013 году, выполняется посредством команды:

grep '[0-2]\{3\}3' data.f

и может иметь вид:



47 Oct 3ZL2013 LPSX 43.00 KVM9D 512

483 may 5PA2013 USP 37.00 KVM9D 644

216 sept 3ZL2013 USP 86.00 KVM9E 234

Примененный в этом примере шаблон означает: найти любую последовательность из трех цифр, за которой идет цифра 3.



Комбинированные диапазоны

Допустим, необходимо найти строки, в которых код города имеет следующий формат: первым символом является произвольная цифра, второй символ выбирается из диапазона от 0 до 5, а третий символ принадлежит диапазону от 0 до 6. Воспользуемся следующей командой:



grep '[0-9][0-5][0-6] ' data.f

Результаты выполнения команды:



47 Oct 3ZL1998 LPSX 43.00 KVM9D 512

484 nov 7PL1996 CAD 49.00 PLV2C 234

483 may 5PA1998 USP 37.00 KVM9D 644

216 sept 3ZL1998 USP 86.00 KVM9E 234
Как видно, отображается больше информации, чем необходимо. Можно сделать вывод, что в шаблоне поиска недостаточно уточнен критерий отбора информации. Очевидно, следует указать, что поиск нужно начинать в начале строки. Для этого применим метасимвол ' ^':

grep '^[0-9][0-5][0-6]' data.f

Результаты выполнения команды:



216 sept 3ZL1998 USP 86.00 KVM9E 234

Поиск повторяющихся последовательностей

Для поиска какой-либо строки, содержащей, например, цифру 4, повто­ренную минимум дважды, следует ввести команду:



grep ' 4\{2,\} ' data.f

Запятая указывает, что предыдущий символ встречается не менее двух раз. Пример результата выполнения команды:



483 may 5PA1998 USP 37,00 KVM9D 644

Для поиска всех записей, содержащих, по крайней мере, три девятки, можно воспользоваться следующей командой:



grep '9\{З,\} ' data.f

Пример результата поиска:



219 dec 2CC1999 CAD 23.00 PLV2C 68

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



grep '8\{2,6}3' myfile

Здесь задан поиск строк, в которых цифра 8 встречается от двух до шести раз подряд и предшествует цифре 3. Ниже приведены варианты:



83 - не соответствует заданному поиску,

888883 - соответствует заданному поиску,

8884 - не соответствует заданному поиску,

88883 – соответствует заданному поиску

Выбор из нескольких шаблонов

Опция позволяет использовать в команде grep синтаксис расширенных регулярных выражений. Предположим, необходимо найти все заказы с кодами городов 216 или 219. В этом случае можно воспользоваться метасимволом '|\ задающим выбор из двух шаблонов:



grep -E '219|216' data.f

Результатом могут быть следующие строки:



219 dec 2CC1999 CAD 23.00 PLV2C 68

216 sept 3ZL1998 USP 86.00 KVM9E 234

Поиск пустых строк

Для поиска в файле пустых строк можно составить шаблон из метасимволов '^' и '$', например:



grep '^$' myfile

Поиск имен файлов, соответствующих заданному формату

Пусть в вашей системе применяется следующий формат наименования

файлов с документами: до шести символов, расположенных в начале, являются буквами нижнего регистра, далее следует точка, а завершают последовательность два символа верхнего регистра. Если требуется найти имена файлов подобного типа, записанные в файл fjlename, следует применить команду:

grep '[a-z]\{1,6\}\. [A-Z]\{1,2\}' fjlename

Названия файлов: yrend.AS, soa.PP, qp.RR - соответствуют заданным условиям, а mothdf - не соответствует.



Поиск IP-адресов

Администратору DNS-сервера приходится поддерживать большое количество IP-адресов, относящихся к различным сетям, например, файл ipfile может содержать свыше 200 адресов. Для поиска всех адресов в формате "ппп.ппп" (т.е. адресов, содержащих две трехзначные последовательности, оканчи­вающиеся точкой), можно воспользоваться следующей командой:



grep '[0-9]\{3\}\.[0-9]\{3\}\.' ipfile

Классы символов

Команда grep поддерживает целый ряд предопределенных диапазонов символов, называемых классами. Обозначение класса состоит из открывающей квад­ратной скобки, двоеточия, собственно имени класса, двоеточия и закрывающей квадратной скобки. Поскольку класс представляет собой диапазон, обозначение класса дополнительно должно заключаться в квадратные скобки:



Класс Эквивалентное регулярное выражение

[:upper:] [A-Z]

[:lower:] [a-z]

[:digit:] [0-9]

[ :alnum:] [0-9a-zA-Z]

[:space:] символы пробела

[:alpha:] [а-zA-Z]

Отличие классов от эквивалентных регулярных выражений состоит в том, что класс включает не только символы английского алфавита из стандартной таблицы ASCII-кодов, но также символы того национального языка, который установлен в данной конкретной системе.

Рассмотрим несколько примеров на базе нашего файла data.f. Предположим, требуется найти все коды заказов, которые содержат цифру 5, сопровождаемую, по крайней мере, двумя буквами в верхнем регистре:



grep '5[[:upper:]][[:upper:]] ' data.f

Результаты поиска:



483 Sept 5AP1996 USP 65.00 LVX2C 189

48З may 5PA1998 USP 37.00 KVM9D 644

Для поиска всех кодов товара, которые оканчиваются буквой 'P' или 'D', введем команду:



grep ' [[:upper:]][[:upper:]] [PD] ' data.f

Ниже приведены результаты выполнения команды:



483

Sept

5AP1996

USP

65.

.00

LVX2C

189

219

dec

2CC1999

CAD

23.

,00

PLV2C

68

484

nov

7PL1996

CAD

49.

.00

PLV2C

234

483

may

5PA1998

USP

37,

.00

KVM9D

644

216

sept

3ZL1998

USP

86.

.00

KVM9E

234

2.7.2. Команда egrep

Команда egrep (extended grep) воспринимает как базовые, так и расширенные регулярные выражения. Одной из привлекательных ее особенностей является воз­можность сохранения шаблонов поиска в файле. Подключается этот файл с помощью опции -f. Рассмотрим пример:



cat grepstrings

484

47

Введем команду:



egrep -f grepstrings data.f

В этом случае в файле data.f осуществляется поиск записей, которые содержат последовательность символов "484" или "47".

Создание файла шаблонов удобно в том случае, когда шаблонов много и вводить их в командной строке затруднительно. Если шаблонов немного, можно воспользоваться метасимволом '|' который позволяет сделать выбор между несколькими шаблонами. Например, следующая команда ищет в файле data.f записи, содержащие последовательность символов "3ZL" или "2СС":

egrep '3ZLI2CC' data.f

Результат поиска:

47 Oct 3ZL1998 LPSX 43.00 KVM9D 512

219 dec 2CC1999 CAD 23.00 PLV2C 68

216 sept 3ZL1998 USP 86.00 KVM9E 234

Круглые скобки позволяют представить выражение с несколькими шаблонами как один шаблон. Так, с помощью представленной ниже команды можно найти в текущем каталоге файлы, в которых встречаются слова из ряда "shutdown", "shut­downs", "reboot" и "reboots":



egrep '(shutdown|reboot} s? ' *

Контрольные вопросы
1) Поясните термин «регулярные выражения».

2) В чем заключается механизм регулярных выражений?

3) Можно ли в регулярном выражении сочетать различные шаблоны поиска?

4) Перечислите метасимволы и базовые операторы, используемые для создания шаблонов для поиска выражений.

5) Назначение и возможности инструментального средства grep.




Поделитесь с Вашими друзьями:
1   2   3   4   5   6


База данных защищена авторским правом ©vossta.ru 2019
обратиться к администрации

    Главная страница