Руководство пользователя для GNU Awk
12.4 Встроенные функции для ввода\вывода
Следующие ниже функции относятся к вводу\выводу (I/O). Необязательные параметры заключены в квадратные скобки ("[" и "]").
close(filename)
Закрывает файл filename для ввода и вывода. Альтернативным аргументом может быть команда оболочки, которая использовалась для перенаправления к или от конвейера; тогда конвейер закрывается. См. раздел 6.8 [Закрытие входных и выходных файлов и конвейеров], стр. 74.
fflush([filename])
Подавить любое связанное с буферным выводом имя, которое есть или файл, открытый для записи или команда оболочки для перенаправления вывода в конвейер. Многие служебные программы буферизуют свой вывод; в нем хранится информация для записи на дисковый файл или терминал в памяти до тех пор пока не наберется достаточная порция для посылки на выходное устройство. Часто это более эффективно чем запись каждого бита при его появлении. Однако, иногда необходимо подтолкнуть программу освободить ее буфера, то есть записать по ее назначению даже если буфер еще не полон. Для этого функция fflush и предназначена. gawk тоже буферизует свой вывод, и функция fflush может использоваться для освобождения ее буферов.
fflush представляет недавнее (1994) добавление к Bell Labs research версии awk; она не входит в стандарт POSIX и недоступна, если в командной строке было набрано `--posix' (см. раздел 14.1 [Параметры командной строки], стр. 161).
gawk расширяет функцию fflush в двух направлениях. Первое состоит в возможности опустить аргумент. В таком случае буфер стандартного вывода очищается. Второе допускает в качестве аргумента пустую цепочку (""). В этом случае очищаются буфера всех открытых выходных файлов и конвейеров. fflush возвращает ноль, если буфер был успешно освобожден, и не ноль в противном случае.
system(command)
Функция system позволяет пользователю выполнить команду операционной системы и затем продолжить выполнение awk-программы. Функция system выполняет команду, определенную командной цепочкой. В качестве своего значения она возвращает состояние, возвращенное выполненной командой. Например, следующий фрагмент кода вашей программы:
END -
system("date -- mail -s 'awk run done' root") ""
посылает системному администратору сообщение об окончании программы, когда она закончит обработку ввода и начнет обработку своего завершения.
Заметим, что перенаправление print или printf в конвейер часто достаточно для завершения вашей задачи. Если нужно выполнить несколько команд, будет более эффективным просто напечатать их в конвейер к оболочке:
while (что нужно сделать)
print command -- "/bin/sh" close("/bin/sh")
Однако если ваша awk-программа интерактивна, system полезна для запуска больших самостоятельных программ, таких как оболочка или редактор. Некоторые операционные системы не могут реализовывать системные функции. В таких случаях system приводит к фатальной ошибке.
Интерактивные vs . Неинтеракивная буферизация
С точки зрения побочных эффектов, использование буферов может усложнится в зависимости от того, является или нет ваша программа интерактивной, т.е. обменивающейся информацией с пользователем, сидящим у терминала.4
Интерактивные программы обычно используют построчные буфера; они выдают информацию построчно. Неинтерактивные программы ждут наполнения буфера, который может содержать многострочный вывод. Вот пример такой разницы:
$ awk '- print $1 + $2 ""' 1 1
a 2 2 3
a 5 Control-d
Каждая строка вывода печатается немедленно. Сравните это поведение со
следующим примером.
$ awk '- print $1 + $2 ""' -- cat 1 1 2 3 Control-d
_____________________________
4 Программа интерактивна, если стандартный вывод связан с терминалом.
a 2
a 5
Здесь никакого вывода не печатается, пока не будет выдан Control-d, поскольку он весь буферизован и послан по конвейеру к cat одной порцией.
Управление выходной буферизацией с помощью функции system
Функция flush осуществляет явное управление выходной буферизацией для отдельных файлов и конвейеров. Но их использование не переносится на многие другие реализации awk. Альтернативный метод очистки выходных буферов состоит в использовании system с пустой цепочкой в качестве аргумента:
system("") # flush output
gawk трактует такое употребление функции system как специальное действие и достаточно ловок, чтобы не выполнять оболочку (или другой интерпретатор команд) с пустой командой. Поэтому для gawk эта идиома не только полезна, но и эффективна. Если этот метод будет работать с другими реализациями awk, можно не стремиться избегать не необходимого вызова оболочки. (Другие реализации могут только освобождать буфер, связанный со стандартным выводом, а не весь буферизованный вывод.)
Если думать о том, что хочет программист, имеет смысл, чтобы система подгоняла все отложенные выводы. Следующая программа:
BEGIN -
print "first print" system("echo system echo") print "second print" ""
должна напечатать
first print system echo second print
а не
system echo first print second print
Если awk не очистила (flush) свои буфера до вызова system, вы увидите последний (нежелательный) вывод.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|