Литмир - Электронная Библиотека
Содержание  
A
A

Ни одно регулярное выражение команды

grep
не соответствует символу перевода строки; выражения сопоставляются с каждой строкой в отдельности. Регулярные выражения делают команду
grep
простым языком программирования. Вспомните, что второе поле файла паролей содержит зашифрованный пароль. Приведенная ниже команда проводит поиск пользователей, не имеющих пароля:

$ grep '^[^:]*::' /etc/passwd

Шаблон расшифровывается так: начало строки, любое число символов, отличных от двоеточия, два двоеточия.

Команда

grep
— старейшая в семействе программ, к которому относятся команды
fgrep
и
egrep
. В основном их действие одинаково, но
fgrep
может одновременно искать несколько литеральных строк, тогда как
egrep
интерпретирует настоящие регулярные выражения, подобно
grep
, но с использованием операций "or" и скобок для группировки выражений, что будет объяснено ниже.

Обе команды,

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

$ fgrep -f типичные_ошибки документ

Регулярные выражения, интерпретируемые

egrep
(они также приведены в табл. 4.1), — те же самые, что и в grep, но с небольшими добавлениями. Можно использовать скобки для группировки, поэтому
(xy)*
задает пустую строку или любую последовательность
xy
,
xyxy
,
xyxyxy
и т.д. Вертикальная черта
|
является операцией or (или);
today|tomorrow
соответствует
today
или
tomorrow
, как и
to(day|morrow)
. Наконец, в команде
egrep
есть еще две операции повторения:
+
и
?
. Шаблон
x+
задает один или более символов
x
, а шаблон
x?
— нуль или один символ
x
(но не более).

Команда

egrep
прекрасно подходит для игр, в которых нужно искать в словаре слова со специальными свойствами. Мы будем обращаться к словарю Вебстера (второе международное издание), хранящемуся в файле в виде списка слов по одному в строке без определений их значения. В вашей системе может быть небольшой словарь
/usr/dict/words
, предназначенный для проверки правописания; просмотрите его, чтобы выяснить формат. Ниже приведен шаблон, задающий слова английского языка, содержащие все пять гласных в алфавитном порядке:

$ cat alphvowels

^[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$

$ egrep -f alphvowels /usr/dict/web2 | 3

abstemious abstemiously abstentions

achelious  acheirous    acleistous

affectious annelidous   arsenious

arterious  bacterious   caesious

facetious  facetiously  fracedinous

majestious

$

В файле

alphvowels
шаблон не взят в кавычки. Если применяются кавычки для экранирования шаблона в команде
egrep
, интерпретатор защищает его от интерпретации командами, но кавычки убирает, и команда
egrep
никогда "не узнает" о них. Поскольку интерпретатор не заглядывает в файл, кавычки не нужны для защиты содержимого файла. Для этого примера мы могли бы использовать команду
grep
, но алгоритм
egrep
таков, что она осуществляет поиск намного быстрее в случае шаблонов с повторителями, особенно при просмотре больших файлов.

В другом примере требуется найти все английские слова, состоящие из шести или более букв, в которых буквы следуют в алфавитном порядке:

$ cat monotonic

^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?r?s?t?u?v?w?x?y?z?$

$ egrep -f monotonic /usr/dict/web2 | grep '......' | 5

abdest acfcnow adipsy  agnosy almost

bedfist behint befcnow bijoux biopsy

chintz  dehors dehort  demos  dimpsy

egilops ghosty

(Egilops — это болезнь, поражающая пшеницу.) Обратите внимание на использование команды

grep
для фильтрации выходного потока
egrep
.

Для чего нужны три сходные программы? Программа

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

Упражнение 4.1

Прочтите о регулярных выражениях

(\(
и
\))
в приложении 1 или справочном руководстве по
ed(1)
. Используйте программу
grep
для поиска палиндромов — слов, читающихся одинаково с конца и начала. Подсказка: составьте свой шаблон для слов каждой длины.

45
{"b":"248117","o":1}