4.1 Семейство программ grep
В гл. 1 мы кратко упомянули о команде grep, а затем использовали ее в примерах. Конструкция
$ grep шаблон имена_файлов
проводит поиск в поименованных файлах или в стандартном входном потоке и выводит на печать каждую строку, в которую входит шаблон. Команда grepнеоценима для поиска переменных в программах и слов в документах, а также для выбора части выходного потока программы:
$ grep -n variable *.[гл] Поиск variable в тексте на Си
$ grep From $MAIL Печать заголовков сообщений из почтовой
посылки
$ grep From $MAIL | grep -v mary Заголовки, которые получены не от
адресата mary
$ grep -y mary $HOME/lib/phone-bookПоиск номера mary
$ who | grep mary Выяснить, работает ли mary в системе
$ ls | grep -v temp Имена файлов, не содержащих temp
Флаг -nинициирует вывод номеров строк, флаг -vменяет на противоположное значение условия, а флаг -yдопускает сопоставление строчных букв из шаблона с прописными буквами из файла (но прописные буквы все-таки могут сопоставляться только с прописными).
Во всех рассматривавшихся до сих пор примерах проводился поиск обычных строк из букв и чисел. Но команда grepможет искать и более сложные шаблоны: она интерпретирует выражения согласно простому языку для описания строк. С технической точки зрения шаблон представляет в некоторой степени ограниченную форму спецификаций строк, называемую регулярным выражением. Команда интерпретирует такие же регулярные выражения, как и редактор ed. На самом деле, эта команда была создана (за один вечер) прямым редактированием ed.
Регулярные выражения характеризуются тем, что ряду символов, таким, как *и т.п., приписывается специальное значение, используемое интерпретатором. Есть еще несколько метасимволов, но, к сожалению, с различными значениями. В табл. 4.1 показаны все метасимволы регулярных выражений, и мы кратко их здесь рассмотрим.
с |
Любой неспециальный символ c соответствует самому себе |
\c |
Указание убрать любое специальное значение символа c |
^ |
Начало строки |
$ |
Конец строки |
. |
Любой одиночный символ |
[...] |
Любой символ из ...;допустимы диапазоны типа a-z |
[^...] |
Любой символ не из ...; допустимы диапазоны |
\n |
Строка, соответствующая n-му выражению \(...\)(только для grep) |
r* |
Нуль или более вхождений r |
r+ |
Одно или более вхождений r(только для egrep) |
r? |
Нуль или одно вхождение r(только для egrep) |
r1r2 |
За r1следует r2 |
r1|r2 |
r1или r2(только для egrep) |
\(r\) |
Помеченное регулярное выражение r(только для grep); может быть вложенным |
(r) |
Регулярное выражение r(только дляgrep); может быть вложенным |
|
Никакое регулярное выражение не соответствует концу строки |
Таблица 4.1: Регулярные выражения grepи egrep(в порядке убывания приоритета)
Метасимволы ^и $привязывают шаблон к началу ( ^) или концу ( $) строки. Например,
$ grep From $MAIL
ищет строки, содержащие Fromв вашей почтовой посылке, но
$ grep '^From' $MAIL
выдает строки, начинающиеся с From, которые, вероятнее всего, будут заглавными строками сообщений. Метасимволы регулярных выражений пересекаются с метасимволами интерпретатора, поэтому всегда имеет смысл заключать шаблоны команды grepв апострофы.
Команда grepдопускает классы символов, подобные тем, что используются интерпретатором: так, [a-z]задает любую строчную букву. Но есть и различия — если класс символов команды grepначинается с символа слабого ударения то шаблон задает любой символ, кроме входящих в данный класс. Значит, [^0-9]задает любой символ, кроме цифры. Как и в интерпретаторе, обратная дробная черта экранирует символы ]и -в классе символов, но команды grepи edтребуют, чтобы эти символы использовались там, где их значение недвусмысленно. Например, шаблон [][-]задает открывающую или закрывающую квадратную скобку либо знак минус.
Точка '.'эквивалентна '?'в интерпретаторе: она задает любой символ. (Точка, по всей видимости, есть символ, назначение которого различно для разных программ.) Ниже приводятся два примера:
Читать дальше
Конец ознакомительного отрывка
Купить книгу