Руководство пользователя для GNU Awk
5. Чтение входных файлов
5.8 Явный ввод по команде getline
5.8.6 Использование getline из конвейера
Можно передавать конвейером (pipe) выход от command к getline, используя `command -- getline'. В таком случае слово command исполняется как команда оболочки и ее выход передается в awk для использования в качестве ввода. Эта форма getline читает за раз одну запись из конвейера.
Например, следующая программа копирует ее ввод на вывод, за исключением строк, которые начинаются с `@execute'; такие строки заменяются выходом, полученным при выполнении остатка строки в качестве команды оболочки.
awk '-
if ($1 == "@execute") -
tmp = substr($0, 10) while ((tmp -- getline) ? 0)
print close(tmp) "" else
print ""'
Функция close вызывается для того, чтобы в случае двух идентичных строк `@execute' во входе команда command выполнялась для каждой из них. См. раздел 6.8 [Закрытие входных и выходных файлов и конвейеры], стр. 74.
Пусть задан ввод:
foo bar baz @execute who bletch
программа может выдать:
foo bar baz arnold ttyv0
Jul 13 14:22 miriam ttyp0
Jul 13 14:23 (murphy:0)
bill ttyp1
Jul 13 14:23 (murphy:0) bletch
Заметим, что эта программа выполняет команду who и печатает результат. (Если вы сами запустите эту программу, вы получите, конечно, другой результат, показывающий вам, кто сейчас работает на вашей системе.)
Этот вариант getline разделяет записи на поля, устанавливает значение NF и пере вычисляет значение $0. Значения NR и FNR не меняются. В соответствии с POSIX, `expression -- getline' не определена, если expression содержит не заключенные в скобки операторы, отличные от `$'; например, `"echo " "date" -- getline' не определена, так как конкатенация не заключена в скобки, нужно писать `("echo " "date") -- getline', чтобы программа была переносимой на другие реализации awks. (Бывает, что gawk ее выполнит правильно, но на это не надо полагаться. Во всяком случае, скобки делают программу легче читаемой.)
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|