355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Дэвид Тейнсли » Linux и UNIX: программирование в shell. Руководство разработчика » Текст книги (страница 5)
Linux и UNIX: программирование в shell. Руководство разработчика
  • Текст добавлен: 15 октября 2016, 00:39

Текст книги "Linux и UNIX: программирование в shell. Руководство разработчика"


Автор книги: Дэвид Тейнсли



сообщить о нарушении

Текущая страница: 5 (всего у книги 25 страниц)

Предположим, я выполняю сценарий comet, обрабатывающий файл month_end.txt, и в случае неудачного завершения сценария хочу прекратить работу интерпретатора shell. Простейший способ сделать это состоит в следующем:

$ comet month_end.txt || exit

Но можно также перед выходом из интерпретатора послать отвечающему за этот сценарий пользователю электронное сообщение:

$ comet month_end.txt || (echo "Привет! Твой сценарий не работает." |

mail dave; exit)

Символ '' в конце первой строки означает, что команда будет продолжена в следующей строке.

Вспомним рассмотренный ранее пример, в котором команда sort сортирует содержимое текстового файла quarter_end.txt, записывая результат в файл quarter.sorted с последующим выводом его на печать:

$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted

Применив метод группировки команд, можно одновременно с печатью файла скопировать его в каталог /logs.

$ sort quarter_end.txt > quarter.sorted &&

(cp quarter.sorted /logs/quarter.sorted; lp quarter.sorted)

6.4. Заключение

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

ЧАСТЬ 2

Фильтрация текста

ГЛАВА 7

Регулярные выражения

При работе в UNIX или Linux часто используются регулярные выражения – мощное средство текстового поиска. Если, например, требуется найти слово, у которого первые два символа являются прописными буквами, а следующие четыре символа – цифрами, сформировать правильный шаблон поиска помогут регулярные выражения.

В этой главе рассматриваются следующие темы:

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

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

   • создание шаблонов для поиска специальных символов;

   • создание шаблонов для поиска символов из указанного набора или диапазона;

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

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

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

В табл. 7.1 перечислены метасимволы и операторы, применяемые в базовых регулярных выражениях.

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

^

Соответствует началу строки

$

Соответствует концу строки

[]

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

[1-5])

[^]

Соответствует любому символу, кроме тех, что указаны в скобках

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

.

Соответствует любому отдельному символу

*

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

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

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

{n}

Указывает на то, что предыдущий шаблон встречается ровно n раз

{n,}

Указывает на то, что предыдущий шаблон встречается не менее п раз

{,m}

Указывает на то, что предыдущий шаблон встречается не более т раз

{n, m}

Указывает на то, что предыдущий шаблон встречается не менее n раз и не более т раз

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

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

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

…x..x..x

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

drwxrwxrw– – не соответствует

–rw‑rw‑rw– – не соответствует

–rwxrwxr‑x -cоответствует

–rwxr‑xr‑x -cоответствует

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

….ХС….

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

1234ХС9088 -cоответствует

4523ХХ9001 – не соответствует

0011ХА9912 – не соответствует

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

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

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

drwxrwxrw– – соответствует

–rw‑rw‑rw– – не соответствует

drwxrwxr‑x -cоответствует.

–rwxr‑xr‑x – не соответствует

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

1234ХС9088 – не соответствует

4523ХХ9001 – не соответствует

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

993IXC3445 – не соответствует

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

^…1

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

1234ХС9088 – не соответствует

4b23ХХ9001 – не соответствует

0011XA9912 -cоответствует

993ДХС3445 -cоответствует

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

^comp

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

^comp..ing

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

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

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

trouble$

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

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

7.4. Поиск символов, встречающихся неопределенное число раз, с помощью метасимвола '*'

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

сотрu*t

отвечает таким словам:

computer

computing

compuuuuute

А шаблон

10133*

соответствует следующему:

101333

10133

10134

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

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

$ . ' " * [ ] ^ | ( ) + ? { }

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

.

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

*.pas

7.6. Поиск символов, входящих в заданный набор или

диапазон

Шаблон [] соответствует списку или диапазону символов, указанных в квадратных скобках.

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

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

[0123456789]

Однако проще задать диапазон:

[0-9]

Следующий шаблон соответствует любой строчной букве:

[a‑z]

Чтобы найти любую букву произвольного регистра, воспользуйтесь шаблоном

[A‑Za‑z]

Здесь формируется список из двух диапазонов: прописные буквы от 'А' до 'Z' и строчные буквы от 'а' до 'z'.

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

[A‑Za‑z0-9]

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

s[a‑zA‑Z]t

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

s[a‑z]t

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

[Сс]omputer

Следующий шаблон соответствует слову "system", которое начинается с прописной или строчной буквы и за которым следует точка:

[S,s]ystem.

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

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

[A‑Za~z]*

Метасимвол '^' после открывающей квадратной скобки – это признак того, что шаблон соответствует любым символам, кроме указанных в скобках. Так, шаблон

[^a‑zA‑Z]

соответствует всем символам, кроме букв, а шаблон отвечает всем символам, которые не являются числами.

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

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


шаблон{n}

Соответствует шаблону, встречающемуся ровно n раз подряд

шаблон(n,}

Соответствует шаблону, встречающемуся не менее n раз подряд

шаблон{,m}

Соответствует шаблону, встречающемуся не более m раз подряд

шаблон{n, m}

Соответствует шаблону, встречающемуся не менее n и не более m раз подряд, где n и m – целые числа из интервала от 0 до 255

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

А{2}В

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

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

А{4,)В

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

А{2,4}В

Будут найдены строки "ААВ", "АААВ", "ААААВ", но не "АВ" или "АААААВ". Вернемся к уже рассматривавшемуся примеру фильтрации текстового файла, фрагмент которого представлен ниже:

1234ХС9088 4523XX90D1 0011ХА9912 9931ХС3445

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

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

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

1234ХС9088 – не соответствует

4523XX900i – соответствует

0Q11XA9912 – не соответствует

9931ХС3445 – не соответствует

7.8. Примеры

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

Таблица 7.2. Полезные регулярные выражения


^the

Соответствует строкам, которые начинаются символами "the"

[Ss]igna[lL]

Соответствует словам "signal", "signaL", "Signal" и "SignaL"

[Ss]igna[lL].

То же, что и в предыдущем случае, но слово, к тому же, должно завершаться точкой

tty$

Соответствует строкам, которые завершаются символами "tty"

^USER$

Соответствует слову "USER", которое является единственным в строке

.

Соответствует точке

^d..x..x..x

Соответствует каталогам с установленным правом на выполнение для владельца, группы и других пользователей

^[^l]

Исключает из списка файлов записи, соответствующие символическим ссыпкам

00*

Находит строки, содержащие два или больше нулей подряд

[lL]

Соответствует прописной и строчной букве 'l'

[iInN]

Соответствует прописным и строчным буквам 'i' и 'n'

^S

Соответствует пустой строке

^.*$

Соответствует строке, состоящей из любого числа символов

^……$

Соответствует строке, состоящей из шести символов

[a‑zA‑Z]

Соответствует любой прописной или строчной букве

[a‑z][a‑z]*

Соответствует по крайней мере одной строчной букве

[^0-9$]

При рассмотрении цифры и знаки доллара не учитываются

[^0-9A‑Za‑z]

При рассмотрении не учитываются буквы и цифры

[123]

Соответствует цифрам 1, 2 и 3

[Dd]evice

Соответствует словам "Device" и "device"

De..ce

Соответствует слову, в котором первые два символа – "De", за ними идут любые два символа, а затем -cимволы "се"

^q

Соответствует символам "^q"

^.$

Соответствует строке, содержащей только один символ

^.[0-9][0-9]

Соответствует строке, которая начинается с точки и двух цифр

«Device»

Соответствует слову "Device"

De[Vv]ice.

Соответствует слову "DeVice" или "Device", после которого стоит точка

[0-9]{2}-[0-9] {2}-[0-9]{4}

Соответствует шаблону даты в формате dd‑mm‑yyyy

[0-9]{3}.[0-9]{3} .[0-9]{3}.[0-9]{3}

Соответствует шаблону IP–адреса в формате ппп. ппп. ппп. ппп

7.9. Заключение

Регулярные выражения и методы работы с ними – важный аспект shell–программирования. Знакомство этой с методикой позволит повысить качество создаваемых сценариев, так как во многих случаях три–четыре команды фильтрации текста можно заменить одной командой с регулярным выражением.

В следующих главах мы рассмотрим примеры применения регулярных выражений в программах grep, sed и awk.

ГЛАВА 8

Семейство команд grep

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

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

   • egrep -pаботает с расширенными регулярными выражениями (не поддерживает только оператор { }).

   • fgrep – быстрый вариант команды grep. Вместо поиска выражений, соответствующих шаблону, выполняет поиск фиксированных строк из указанного списка. Пусть вас не вводит в заблуждение слово "быстрый". На самом деле это наиболее медленная из команд семейства grep.

Конечно, хотелось бы, чтобы существовала только одна, универсальная, команда

grep, и с этой ролью, в принципе, справляется GNU–версия grep. К сожалению,

нет единого способа задания аргументов для всех трех разновидностей команды grep,

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

   • параметры команды grep;

   • применение регулярных выражений в команде grep;

   • особенности поиска алфавитно–цифровых символов.

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

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

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

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

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

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

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

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

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

$ cat : data .f

48 dec 3ВС1997 LPSX 68.00 LVX2A 138

483 sept 5AP1996 USP 65.00 LVX2C 189

47 oct 3ZL1998 LPSX 43.00 KVM9D 512

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

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

8.1. Команда grep

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

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

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

8.1.1. Употребление кавычек

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

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

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

8.1.2. Параметры команды grep

Ниже перечислены основные параметры команды grep:


-c

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

-i

Дает указание игнорировать регистр символов

-h

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

-1

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

-n

Задает нумерацию выводимых строк

-s

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

-v

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

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

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

$ grep sort *.doc

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

$ grep "sort it" *

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

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

$ grep -с "48" data.f

4

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

$ grep "48" data.f

48 dec 3BC1997 LPSX 68.00 LVX2A 138

453 sept 5AP1996 USP 65.00 LVX2C 189

484 nov 7PL1996 CAD 49.00 PLV2C 234

4 83 may 5PA1998 USP 37.00 KVM9D 644

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

С помощью опции -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

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

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

Благодаря опции -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

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

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

$ grep "48" data.f

48 Dec 3BC1997 LPSX 68.00 LVX2A 138

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

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

$ grep '48>' data.f

48 Dec ЗВС1997 LPSX 68.00 LVX2A 138

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

По умолчанию команда 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

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

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

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

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

$ grep '48[34]' data.f

493 Sept 5AP1996 USP 65.00 LVX2C 189

484 nov 7PL1996 CAD 49.00 PLV2C 234

483 may 5PA1998 asp 37.00 KVM9D 644

8.2.2. Инверсия шаблона с помощью метасимвола ""

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

$ grep '^[^48]' data.f

219 dec 2СС1999 CAD 23.00 PLV2C 68

216 sept 321Л998 USP 86.00 KVM9E 234

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

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

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

$ grep 'K…D' data.f

47 Oct 3ZL1998 LPSX 43.00 KVM9D 512

483 may 5PA199S USP 37.00 KVW9D 644

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

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

$ grep '[A‑Z][A‑Z]..C' 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

8.2.4. Поиск по дате

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

$ grep '5..199[68]' data.f

483 Sept 5АР1996 USP 65.00 LVX2C 189

483 may 5РА1998 USP 37.00 KVM9D 644

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

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

$ grep '[0-9]{3}8' data.f

47 Oct 3ZL1998 LPSX 43.00 KVM9D 512

483 may 5PA1998 USP 37,00 KVM9D 644

216 sept 3ZL1998 USP 86.00 KVM9E 234

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

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

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

$ grep ' [0-9][0-5][0-63' data.f

47 Oct 3ZL1998 LPSX 43.00 KVM9D 512

484 nov 7PL1996 CAD 49.00 PLV2C 234

483 may 5PA199B 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

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

Если необходимо найти какую‑либо строку, которая содержит цифру 4, повторенную минимум дважды, задайте такую команду:

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

483 may 5PA1998 USP 37.00 KVM9D 644

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

$ grep '9{3,}' data.f

219 dec 2СС1999 CAD 23.00 PLV2C 68

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

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

83 – не соответствует

888883 -cоответствует

8884 – не соответствует

88883 -cоответствует

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

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

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

$ grep -E '219|216' data.f

219 dec 2СС1999 CAD 23.00 PLV2C 68

216 sept 3ZL1998 USP 86.00 KVM9E 234

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

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

$ grep '^$' myfile

8.2.9. Поиск специальных символов

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

$ grep '.' myfile

Следующая команда ищет в файле myfile двойные кавычки:

$ grep "" ' myfile

А вот эта команда отбирает в листинге команды ls -l запись, соответствующую файлу control.conf.

$ ls -l | grep 'control.conf'

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

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

$ grep '[а–z]{1,6}.[А–Z]{1,2}' filename.deposit

yrend. AS – соответствует

mothdf – не соответствует

sca.PP – соответствует

qp.RR – соответствует

8.2.11. Поиск IP–адресов

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

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

8.2.12. Поиск строк с использованием подстановочных знаков

Предположим, имеется такой файл:

$ cat testfile

looks likes looker long

Следующая команда находит в нем слова, начинающаяся с буквы 'l', после которой идет произвольное число символов, а за ними – буква 's':

$ grep 'l.*s' testfile

looks likes

Показанная ниже команда отбирает слова, начинающиеся с буквы 'l', после которой идет произвольное число символов, затем – буква 'к', а после нее – еще один символ:

$ grep 'l.*k.' testfile

looks likes

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

$ grep 'ооо*' testfile

looks

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

$ grep 'device$' *

Эта команда ищет во всех файлах текущего каталога строки, завершающиеся словом "device".

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

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

Таблица 8.1. Основные классы символов и эквивалентные им регулярные выражения


Класс

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

[:upper:]

[A‑Z]

[:lower:]

[a‑z]

[:digit:]

[0-9]

[:alnum:]

[0-9a‑zA‑Z]

[:space:]

символы пробела

[:alpha:]

[a‑zA‑Z]

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

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

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

483 Sept 5АР1996 USP 65.00 LVX2C 189

483 may 5РА1998 USP 37.00 KVM9D 644

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

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


    Ваша оценка произведения:

Популярные книги за неделю