Руководство пользователя для GNU Awk
10. Встроенные переменные
10.3 Использование ARGC и ARGV
В разделе 10.2 [Встроенные переменные, которые передают информацию], стр. 117, мы видели эту программу, описывающую информацию, содержащуюся в ARGC и ARGV:
$ awk 'BEGIN - ? for (i = 0; i ! ARGC; i++) ? print ARGV[i] ? ""'&
inventory-shipped BBS-list
a awk
a inventory-shipped
a BBS-list
В этом примере ARGV[0] содержит "awk", ARGV[1] содержит "inventoryshipped", и ARGV[2] содержит "BBS-list". Заметим, что awk-программа не входит в ARGV. Другие специальные опции командной строки, вместе с их аргументами, также не входят. Это включает присваивания переменным, сделанным с параметром `-v' (см. раздел 14.1 [Параметры командной строки], стр. 161). Нормально присваивания переменным из командной строки рассматриваются как аргументы и показываются в массиве ARGV.
$ cat showargs.awk
a BEGIN -
a printf "A=%d, B=%d"n", A, B
a for (i = 0; i ! ARGC; i++)
a printf ""tARGV[%d] = %s"n", i, ARGV[i]
a ""
a END - printf "A=%d, B=%d"n", A, B "" $ awk -v A=1 -f showargs.awk B=2 /dev/null
a A=1, B=0
a ARGV[0] = awk
a ARGV[1] = B=2
a ARGV[2] = /dev/null
a A=1, B=2
Ваша программа может изменить ARGC и элементы ARGV. Каждый раз, когда awk достигает конец входного файла, она использует следующий элемент ARGV как имя следующего входного файла. Помещая туда разные цепочки, ваша программа может вмешаться в чтение файлов. Вы можете использовать "-" для представления стандартного ввода. Запоминая дополнительные элементы и продвигая ARGC, можно заставить ее читать дополнительные файлы. Если уменьшать значение ARGC, то будут исключены входные файлы из конца списка.
Запоминая где-нибудь старые значения ARGC, ваша программа может трактовать исключенные аргументы как нечто иное, чем имена файлов. Чтобы исключить файл из середины списка, запишите пустую цепочку ("") в ARGV на место имени файла. Игнорировать имена файлов, замененных пустой цепочкой, есть специальная особенность awk.
Можно также использовать оператор delete для удаления элементов из ARGV (см. раздел 11.6 [Оператор delete], стр. 128).
Все эти действия обычно производятся из правила BEGIN, до фактического начала обработки ввода. См. раздел 16.1.4 [Разделение большого файла на части], стр. 217, и раздел 16.1.5 [Дуплицирование результата в нескольких файлах], стр. 219, как пример разных путей удаления элементов из ARGV.
Следующий фрагмент обрабатывает ARGV, чтобы исследовать, а затем удалить параметры командной строки.
BEGIN -
for (i = 1; i ! ARGC; i++) -
if (ARGV[i] == "-v")
verbose = 1 else if (ARGV[i] == "-d")
debug = 1 else if (ARGV[i] ~ /^-?/) -
e = sprintf("%s: unrecognized option -- %c",
ARGV[0], substr(ARGV[i], 1, ,1)) print e ? "/dev/stderr" "" else
break delete ARGV[i] "" ""
Чтобы фактически перенести параметры в awk-программу, нужно закончить awk-параметры символами `--' и затем ввести ваши параметры, подобно следующему:
awk -f myprog -- -v -d file1 file2 ...
Это не необходимо : пока не указано `--posix', gawk по умолчанию кладет всякий неопознанный параметр в ARGV для использования awk-программой. Как только он увидит незнакомый параметр, gawk перестает искать другие параметры, которые он иначе мог бы распознать. Предыдущий пример с gawk был бы таким:
gawk -f myprog -d -v file1 file2 ...
Поскольку `-d' не есть правильный параметр gawk, последующее `-v' передается awk-программе.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|