В этой главе рассматриваются следующие темы: в выполнение команды в зависимости от результата выполнения другой команды; в группирование команд.
Интерпретатор shell располагает операторами && и, которые группируют команды по принципу логического И/ИЛИ. Существуют также операторы () и {}, объединяющие заключенные в них команды в группу, выполняемую в текущем или порожденном интерпретаторе shell.
6.1. Оператор &&
Общий формат оператора && таков:
команда1 && команда2
Эта инструкция обрабатывается следующим образом: правый операнд интерпретируется только тогда, когда левый операнд равен TRUE. Иными словами, вторая команда выполняется в том случае, если первая завершилась успешно.
Рассмотрим простой пример:
$ cp justice.doc justice.bak && echo "копирование прошло успешно"
копирование прошло успешно
Сообщение, заданное в команде echo, появилось на экране, значит, команда cp успешно выполнила копирование файла. А вот более практичный пример:
$ mv /apps/bin /apps/dev/bin && rm -r /apps/bin
Каталог /apps/biп с помощью команды mv перемешается в каталог /apps/dev/bin. Если перемещение завершится удачно, то исходный каталог - /apps/biп — будет удален.
В следующем примере команда sort сортирует содержимое текстового файла quarter_end.txt, записывая результат в файл quarter, sorted. Если запись прошла успешно, полученный файл выводится на печать с помощью команды lp.
$ sort quarter_end.txt > quarter.sorted && lp quarter. sorted
6.2. Оператор ||
Рассмотрим общий формат оператора | |:
команда1 || команда2
Эта инструкция обрабатывается следующим образом: правый операнд интерпретируется только тогда, когда левый операнд равен false. Иными словами, вторая команда выполняется в том случае, если первая завершилась неуспешно.
Приведем простой пример, иллюстрирующий применение оператора | |:
$ cp wopper.txt oops.txt || echo "копирование не выполнено"
cp: wopper.txt: No such file or directory копирование не выполнено
Операция копирования завершилась неудачно (исходного файла не существует), поэтому была выполнена команда echo.
В следующем примере из файла acc.qtr извлекаются первое и пятое поля, а результат помещается во временный файл qtr.tmp. Если по какой‑то причине извлечь нужные данные не удастся, пользователь dave получит электронное сообщение.
$ awk ' {print$1,$5}' acc.qtr > qtr.tmp || echo "Получить данные не удалось." | \
mail dave
6.3. Группирование команд с помощью скобок
Существует возможность объединить несколько команд в группу и выполнить ее как единое целое в текущем или порожденном интерпретаторе shell. Во втором случае создается копия текущего интерпретатора, а все изменения среды интерпретатора отменяются по завершении последней команды в группе.
Для выполнения группы команд в текущем интерпретаторе shell следует заключить их список в фигурные скобки, разделив команды точкой с запятой:
{команда1; команда2; …}
Чтобы выполнить группу команд в порожденном интерпретаторе shell, поступите аналогичным образом, но вместо фигурных скобок поставьте круглые скобки:
(команда1; команда2; …)
Сам по себе подобный метод применяется не часто. Обычно группа команд выполняется в составе более крупных конструкций с операторами && или. Результатом работы группы команд считается результат выполнения последней команды в группе.
Предположим, я выполняю сценарий 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, где испольуются расширенные регулярные выражения, существует два дополнительных оператора: