Руководство пользователя для GNU Awk
6. Печатный вывод
6.6 Перенаправление вывода от print и printf
До сих пор мы имели дело с выходом от печати только на стандартное устройство, обычно на терминал. И print и printf могут также посылать результаты своей работы в другие места. Это называется перенаправлением.
Перенаправление ставится после операторов print или printf. Перенаправление в awk записывается точно так же как и в командах оболочки, только они пишутся внутри awk-программы.
Имеются три формы перенаправления: в файл, в конец файла, и в вывод по конвейеру в другую команду. Мы покажем их для оператора print, но они точно такие же и для printf.
print items ? output-file
Этот тип перенаправления печатает в файле с именем output-file, заданном любым выражением. Его значение преобразуется в цепочку и затем используется как имя файла (см. Главу 7 [Выражения], стр. 77).
Когда используется такой тип перенаправления, выходной файл очищается перед выводом в него. Во втором случае результаты дописываются в конец указанного файла без его предварительной очистки. Если файла не было, он создается.
Вот пример того, как awk-программа напишет список имен BBS в файл `name-list' и список телефонных номеров в файл `phone-list'. Каждый выходной файл содержит по одному имени или номеру в каждой строке.
$ awk '- print $2 ? "phone-list" ?
print $1 ? "name-list" ""' BBS-list
$ cat phone-list
a 555-5553
a 555-3412...
$ cat name-list
a aardvark
a alpo-net...
print items ?? output-file
Этот тип перенаправления выдает результаты в существующий выходной файл с именем output-file. Разница между этим и перенаправлением с одним только `?' состоит в том, что прежнее содержимое ( если оно было) выходного файла не стирается. Вместо этого выход от awk приписывается в конец файла. Если файла не было, он создается вновь.
Команда print items
Можно также посылать результаты печати вместо файла в другую программу через конвейер. Этот тип перенаправления открывает конвейер для команды и передает значения аргументов по этому конвейеру другому процессу, созданному для выполнения команды. Команда перенаправления аргумента фактически является выражением awk. Его значение преобразуется в цепочку, содержание которой служит командой оболочки, подлежащей исполнению. Например, следущее производит два файла, один --- несортированный список имен BBS и другой --- список, отсортированный в обратном алфавитном порядке:
awk '- print $1 ? "names.unsorted"
command = "sort -r ? names.sorted"
print $1 -- command ""' BBS-list
Здесь не отсортированный список пишется с обычным перенаправлением, а отсортированный записывается по конвейеру через утилиту сортировки. Следующий пример использует перенаправление для отправки сообщения в почтовый список `bug-system'. Это может быть полезным поддержки системы, если ошибки часто обнаруживаются при исполнении сценария awk.
report = "mail bug-system"
print "Awk script failed:",
$0 -- report m =
("at record number " FNR " of " FILENAME)
print m -- report close(report)
Сообщение строится с использованием конкатенации строк и сохраняется в переменной m. Затем оно посылается через конвейер в почтовую программу. Мы вызываем функцию close, потому что полезно закрывать конвейер как только весь вывод поступил в него. См. раздел 6.8 [Закрытие входных и выходных файлов и конвейеров], стр. 74, для подробного ознакомления. Этот пример также иллюстрирует использование переменных для представления файлов или команд: необязательно использовать всегда строковые константы. Использование переменных является полезной идеей, так как awk требует, чтобы всегда строковые значения одинаково записывались.
Перенаправление вывода с использованием `?', `??' или `--' просит систему открывать файл или конвейер только если соответствующий файл или команда, указанные вами, еще не использовались вашей программой или были закрыты после последнего обращения к ним.
Как ранее уже говорилось (см. раздел 5.8.8 [Обзор вариантов getline], стр. 59), многие реализации awk ограничивают число конвейеров, которые может открыть awk-программа, только одним! В gawk такого ограничения нет. Вы можете открыть их столько, сколько позволяет используемая операционная система.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|