Наибольшего эффекта awk достигает
при использовании с другими
программами. В этом подразделе
обсуждаются некоторые способы
взаимодействия программ awk с
другими командами.
10.25.1. Функция system
Встроенная функция system (command_line)
выполняет команду "command_line",
которая может быть строкой,
вычисляющей, например, sprintf. Функция
system возвращает состояние
выполненной команды.
Например:
$1 == "#include" { gsub (/[<>"]/, $2;
system ("cat " $2}
вызывает команду cat для печати
файла, названного во втором поле
каждой вводной записи, у которой
первое поле #include, после разборки
каждого <, > или ", которые
должны присутствовать.
10.25.2. Взаимодействие с shell
Во всех приводимых примерах
программа awk находилась в файле и из
него осуществлялся вызов с помощью
ключа -f, либо она представлялась в
командной строке, заключенная в
одиночные кавычки. Например:
awk '{ print $1 }' ...
Так как awk использует те же
символы, что и shell (такие как $ и ",
окружающие программу awk), одиночные
кавычки обеспечат прохождение
программы неизменной через shell к
интерпретатору awk.
Пример. Команда addr осуществляет
выборку файла addresslist для получения
имени, адреса и телефона.
Предположим, что addresslist содержит
имена и адреса, в котором типичным
входом является многострочная
запись, такая как:
G. R. Emlin
600 Mountain Avenue
Murray Hill, NJ 07974
201-555-1234
Записи разделяются одной пустой
строкой. Вы можете выбрать список
адресов с помощью командной строки,
подобной:
addr Emlin
Это легко выполнить с помощью
следующей программы:
awk '
BEGIN { RS = "" }
/Emlin/
' addresslist
Проблема состоит в том, чтобы
получить различные шаблоны выборок
при каждом запуске программ.
Существует несколько способов
сделать это. Один из способов - это
создать файл, названный addr, который
содержит:
awk '
BEGIN { RS = "" }
/'$1'/
' addresslist
В программе awk один аргумент, хотя
установлено два набора кавычек, но
они не являются вложенными. $1
заключено в одиночные кавычки и
видимо для shell; затем будет заменено
на шаблон Emlin при вызове команды addr
Emlin.
Второй способ реализации addr
полагается на тот факт, что shell
заменяет параметры $ в двойных
кавычках:
awk "
BEGIN { RS = \"\" }
/$1/
" addresslist
Кроме того, вы должны защитить
кавычки, определяющие RS символами \,
так что shell направит их awk без
интерпретации. $1 распознается как
параметр и shell заменяет его на
шаблон, когда команда addr вызывается
с шаблоном.
Третий способ реализации addr -
использовать ARGV для передачи
регулярного выражения программе awk,
которая читает список адресов с
помощью getline:
awk '
BEGIN { RS = ""
while ( getline < "addresslist" )
if ($0 ~ ARGV[1]
print $0
} ' $*
Вся обработка выполняется в
"действии" оператора BEGIN.
Обратите внимание, что регулярное
выражение может быть передано addr. В
частности, возможно отыскать
отдельно адрес, или номер телефона,
или имя.
|