Руководство
пользователя для GNU Awk
Arnold
D. Robbins
перевод Балуева А. Н.
14.
Запуск awk
Оглавление
Имеются
два пути для запуска awk: с явной программой или с одним или более
программными файлами. Здесь мы приводим трафареты для обоих
способов; объекты, заключенные в `[...]' в этих трафаретах
необязательны.
Кроме
традиционных однобуквенных параметров в стиле POSIX, gawk также
имеет длинные параметры GNU.
awk [параметры] -f progfile [--] file ... awk [параметры] [--] 'program' file ...
Можно запустить awk с пустой программой:
$ awk '' datafile1 datafile2
Такое
действие имеет мало смысла; awk просто молчаливо закончится, если
ему подсунуть пустую программу (d.c.). Если `--lint' был указан в
командной строке, gawk сообщит, что программа пуста.
14.1
Параметры командной строки
Параметры
начинаются с символа dash и состоят из одного символа. Длинные
параметры в стиле GNU состоят из двух dash и ключевого слова.
Ключевые слова могут сокращаться, если сокращение однозначно
определяет параметр. Если параметр имеет аргумент, то немедленно
за ключевым словом следует знак равенства (`=') и значение
аргумента, или ключевое слово и аргумент разделяются знаками
whitespace. Для краткости ниже мы ссылаемся только на традиционно
короткие параметры; однако короткие и длинные параметры
взаимозаменяемы во всех контекстах.
Каждый
длинный параметр для gawk имеет соответствующий параметр в стиле
POSIX. Параметры и их значения таковы:
-F
fs --field-separator fs
Устанавливает
в переменной FS значение fs (см. раздел 5.5 [Указание того, как
разделяются поля], стр.44).
-f
source-file --file source-file
Указывает,
что awk-программа должна быть взята из входного файла (вместо
первого аргумента, не являющегося параметром).
-v
var=val --assign var=val
Присвоить
переменной var значение val перед началом выполнения программы.
Эти значения доступны внутри правил BEGIN (см. раздел 14.2 [Другие
аргументы командной строки], стр. 165). Параметр
`-v'
может установить только одну переменную, но его можно использовать
много раз, каждый раз с новой переменной, подобно следующему:
`awk
-v foo=1 -v bar=2 ...'.
-mf
NNN -mr NNN Устанавливает различные пределы памяти для
значения NNN. Флажок `f' устанавливает максимальное число полей, а
флажок `r' устанавливает максимальный размер записи. Эти два
флажка и параметр `-m' взяты из версии Bell Labs research для Unix
awk. Они нужны для совместимости, поскольку gawk не имеет
предопределенных лимитов.
-W
gawk-opt
Согласно
стандарту POSIX параметры, которые представляют особенность
реализации, добавляются в качестве аргументов параметра `-W'. Эти
параметры также имеют соответствующие стилю GNU длинные параметры.
См. ниже.
--
означает конец параметров командной строки. Следующие за этим
аргументы не считаются параметрами даже если они начинаются с `-'.
Такая интерпретация пары `--' определена стандартом POSIX. Это
полезно, если имеются файлы с именами, начинающимися с `-', или в
сценариях оболочки, если вы имеете имена файлов, указываемых
пользователем, который может начинать их с `-'.
Доступны
следующие специфичные для gawk параметры: -W traditional
-W
compat --traditional
--compat
определяет режим совместимости, в котором все расширения GNU языка
awk недействительны и gawk ведет себя подобно версии Bell Labs
research для Unix awk. `--traditional' есть предпочтительная форма
этого параметра. См. раздел 17.5 [Расширения в gawk, отсутствующие
в POSIX awk], стр. 256, где делается обзор расширений. Также см.
раздел C.1 [Совместимость вниз и отладка], стр. 295.
-W
copyleft -W copyright --copyleft --copyright
Печатают
короткие версии General Public License и затем прекращают работу.
Эти параметры могут быть убраны из будущих версий gawk.
-W
help -W usage --help --usage
Печатают
сообщение "usage" с обзором коротких и длинных форм
параметров, которые принимает gawk и затем производят exit.
-W
lint --lint
Предупреждают
о конструкциях, которые сомнительны или непереносимы на другие
реализации. Некоторые предостережения выдаются, когда gawk вначале
читает программу. Другие выдаются при ее исполнении.
-W
lint-old --lint-old
Предупреждает
о конструкциях, которые недоступны в оригинальной версии 7 Unix
awk (см. раздел 17.1 [Главные различия между V7 и SVR3.1], стр.
253).
-W
posix --posix
Действия
строго в режиме POSIX. Отменяет все расширения gawk (подобно
`--traditional'), и добавляет дополнительно следующие ограничения:
Управляющие
последовательности "x не распознаются (см. раздел 4.2
[управляющие последовательности], стр. 24).
Newlines
не действуют как whitespace для разделения полей, когда FS равна
одному пробелу.
Синоним
func для ключевого слова function не распознается (см. раздел 13.1
[Синтаксис определения функции], стр. 153).
Операторы
`**' и `**=' нельзя употреблять вместо `^' и `^=' (см. раздел 7.5
[Арифметические операторы], стр. 82, а также раздел 7.7 [Выражения
присваивания], стр. 84).
Указание
`-Ft' в командной строке не устанавливает значение FS на один
символ tab (см. раздел 5.5 [Указания как разделять поля], стр.
44).
Встроенная
функция fflush не действует (см. раздел 12.4 [Встроенные функции
для ввода/вывода], стр. 146).
Если
в командной строке указаны и `--traditional' и `--posix', то будет
действовать режим `--posix'. gawk также выдаст сообщение, если
присутствуют оба параметра.
-W
re-interval --re-interval
Допускает
интервальные выражения (см. раздел 4.3 [Операторы регулярных
выражений], стр. 26), в регулярных выражениях. Так как
интервальные выражения традиционно недоступны в awk, gawk по
умолчанию не допускает их. Это предотвращает прерывания старых
awk-программ.
-W
source program-text --source program-text
Исходный
программный код извлекается из текста программы. Этот параметр
позволяет смешивать исходный код в файлах с исходным кодом,
который вы пишите в командной строке. Это особенно полезно, когда
вы имеете библиотечные функции, которые хотите использовать из
программ в командной строке (см. раздел 14.3 [Переменная окружения
AWKPATH], стр. 166).
-W
version --version
Печатает
информацию о версии используемой копии gawk. Это позволяет
определить, является ли ваша копия gawk последней по отношению к
тем, которые распространяет Free Software Foundation. Это также
полезно для ваших сообщений об обнаруженных ошибках (см. раздел
B.7 [Сообщения о проблемах и ошибках], стр. 292).
Всякие
другие параметры отмечаются как неправильные и игнорируются. В
режиме совместимости, как специальный случай, если значение fs,
устанавливаемое параметром `-F', есть `t', то FS устанавливается
на символ tab (""t"). Это верно только при
`--traditional'и неверно при `--posix' (см. раздел 5.5 [Указания о
разделении полей], стр. 44).
Параметр
`-f' может использоваться более одного раза в командной строке.
Если это так, awk читает свою программу из всех названных файлов,
так, как если бы они были соединены в один большой файл. Это
полезно для создания библиотек функций awk. Полезные функции могут
быть написаны один раз и затем выбираться из стандартного места,
вместо того, чтобы включаться в каждую индивидуальную программу.
Можно
печатать программу на терминале и пользоваться библиотечными
функциями, указывая `-f /dev/tty'. awk будет читать file с
терминала для использования как часть awk-программы. Набрав свою
программу, напечатайте Control-d (символ конца файла)для указания
ее конца. (Можно также использовать `-f -' для чтения исходной
программы с стандартного ввода, но тогда вы не будете в состоянии
использовать стандартный ввод как источник данных.)
Вследствие
того, что неудобно использовать стандартные механизмы awk для
смеси входного файла и программ из командной строки, gawk
предлагает параметр `--source'. Он не требует от вас
преимущественного использования стандартного ввода для входной
программы и позволяет легко смешивать входной код из командной
строки с кодом из библиотеки (см. раздел 14.3 [Переменная
окружения AWKPATH], стр. 166). Если не указаны ни `-f' ни
`--source', то gawk будет использовать первый аргумент в командной
строке, который не является параметром, как текст из входной
программы.
Если
имеется переменная окружения POSIXLY.CORRECT, то gawk будет
действовать строго в режиме POSIX, как если бы был указан параметр
командной строки `--posix'. Многие программы GNU ищут эту
переменную окружения, включающую режим строгий режим POSIX. Если в
командной строке указать `--lint' и gawk перейдет в режим POSIX по
POSIXLY.CORRECT, то он напечатает предупреждение, указывающее, что
задействован режим POSIX. Обычно эту переменную устанавливают в
стартовом файле оболочки. В случае оболочки, совместимой с Bourne
(такой как Bash), следует добавить эту строку к файлу `.profile' в
вашем начальном каталоге:
POSIXLY.CORRECT=true
export POSIXLY.CORRECT
В
случае оболочки, совместимой с csh, *1* следует добавить такую
строку к файлу `.login' в вашем начальном каталоге:
setenv
POSIXLY.CORRECT true
14.2
Другие аргументы командной строки
Всякие
дополнительные аргументы командной строки нормально
рассматриваются как входные файлы для обработки в указанном
порядке. Однако, аргумент, который имеет вид var=value,
присваивает значение value переменной var и вовсе не означает
никакой файл. Все такие аргументы доступны вашей awk-программе в
массиве ARGV (см. главу 10 [Встроенные переменные], стр. 115).
Параметры командной строки и текст программы ( если он
присутствовал) не попадают в ARGV. Все другие аргументы, включая
присваивания переменным, попадают в него. При обработке любого
элемента ARGV gawk устанавливает переменную ARGIND на индекс
текущего элемента ARGV. Различие между аргументами имен файлов и
присваиваний переменным определяется, когда awk собирается открыть
следующий входной файл. В этой точке выполнения программы он
проверяет "file name" чтобы проверить, не есть ли это
присваивание переменной; если так, то awk вместо чтения файла
присваивает значение переменной. Поэтому переменные получают
значения фактически после прочтения всех файлов, указанных ранее
этого присваивания. В частности, значения таких переменных
недоступны внутри правила BEGIN (см. раздел 8.1.5 [Специальные
образцы BEGIN и END, стр. 100), потому что такие правила
выполняются до начала сканирования списка аргументов.
В
значениях переменных, заданных в командной строке, обрабатываются
управляющие последовательности (d.c.) (см. раздел 4.2 [Управляющие
последовательности], стр. 24). В некоторых ранних реализациях,
когда присваивания переменным встречались до имен файлов, они
выполнялись до выполнения правил BEGIN. Тем самым поведение awk
было непоследовательным.
1
Не рекомендуется.
Некоторые
присваивания из командной строки оказывались доступными внутри
правил BEGIN, а другие нет. Некоторые приложения зависели от этого
"свойства". Когда awk была изменена для устранения
противоречий, параметр `-v' был добавлен для обеспечения
приложений, которые зависели от прежнего поведения.
Возможность
присваивания из командной строки наиболее удобна для присваивания
таким переменным как RS, OFS и ORS, которые управляют форматом
ввода и вывода, перед просмотром файлов с данными. Это также
полезно для проверки состояния, если необходимы повторные
просмотры файлов с данными.
Например:
awk 'pass == 1 - pass 1 stuff ""
pass == 2 - pass 2 stuff ""' pass=1 mydata pass=2 mydata
Имея
возможность присваивания переменным, не обязательно пользоваться
параметром `-F' для установки значения FS. Он остается для
исторической совместимости.
14.3
Переменная окружения AWKPATH
В
предыдущем разделе говорилось о том, как программные файлы awk
могут быть названы в командной строке с помощью параметра `-f'. В
большинстве реализаций awk можно указать точный путь к каждому
программному файлу, когда он не лежит в текущем каталоге. Но в
gawk, если имя файла, указанного параметром `-f', не содержит `/',
то gawk просматривает список каталогов (называемый search path)
один за другим, отыскивая файл с указанным именем. search path
есть цепочка, состоящая из имен каталогов, разделенных
двоеточиями. gawk получает путь к ней из переменной окружения
AWKPATH. Если этой переменной нет, то gawk использует путь по
умолчанию, который есть `.:/usr/local/share/awk'. *2* (Программы,
написанные для использования системным администратором, должны
использовать переменную AWKPATH, которая не содержит текущий
каталог, `.'.)
Возможность
поиска пути особенно удобна для построения библиотек полезных
функций awk. Библиотечные файлы могут быть помещены в стандартный
каталог на пути по умолчанию и затем указаны в командной строке
коротким файловым именем. Иначе для каждого файла нужно будет
указывать полное файловое имя.
Используя
оба параметра, `--source' и `-f', ваша awk-программа в командной
строке может использовать средства файловой библиотеки awk. См.
Главу 15 [Библиотека функций awk], стр. 169.
2
Ваша версия gawk может использовать каталог, отличный от
`/usr/local/share/awk'; это зависит от того, как gawk был построен
и установлен. Фактический каталог будет значением `$(datadir)',
генерированным, когда gawk конфигурировалась. Вероятно, вам не
стоит заботиться об этом.
Поиск
пути не производится, если gawk работает в режиме совместимости.
Это также верно для обоих параметров `--traditional' и `--posix'.
См. раздел 14.1 [Параметры командной строки], стр. 161.
ЗАМЕЧАНИЕ:
если вы хотите, чтобы находились файлы из текущего каталога, вы
должны включить текущий каталог в путь поиска, либо включив явно
`.' в путь, либо написав нулевой вход в путь. (Нулевой вход
указывается посредством начала или окончания пути двоеточием, или
помещением двух двоеточий подряд (`::').) Если текущий каталог не
включен в путь поиска, то файлы в текущем каталоге не будут
найдены. Такой механизм поиска идентичен оболочечному.
Начиная
с версии 3.0, если AWKPATH не определен в окружении, gawk поместит
свой путь по умолчанию в ENVIRON["AWKPATH"]. Это
позволяет легко определить фактический путь поиска, используемый
gawk.
14.4
Устаревшие параметры и/или возможности
В
этом разделе описываются возможности и/или параметры командной
строки из прежних выпусков gawk, которые или недоступны в текущей
версии, или еще поддерживаются, но не рекомендуются (имея ввиду,
что их не будет в следующем выпуске).
В
версии 3.0.4 gawk не имеется параметров командной строки или
других не рекомендуемых черт из прежней версии gawk. Таким
образом, настоящий раздел в основном представляет место для
средств, которые будут отсутствовать в будущих версиях gawk.
14.5
Недокументированные параметры и свойства
Этот
раздел намеренно оставлен пустым.
14.6
Известные ошибки в gawk
Параметр
`-F' для изменения значения FS (см. раздел 14.1 [Параметры
командной строки], стр. 161) не обязательно имеет свойство
присваивания переменным командной строки; он остается только для
совместимости вниз.
Если
ваша система фактически имеет поддержку для `/dev/fd' и
соответствующих файлов `/dev/stdin', `/dev/stdout' и
`/dev/stderr', можно получать другие выходы от gawk по сравнению с
теми, которые можно получить в системе без этих файлов. Когда gawk
интерпретирует эти файлы внутренним образом, она синхронизирует
вывод по стандартному выходу с выводом в `/dev/stdout', в то время
как в системах с такими файлами вывод действительно идет в
различные открытые файлы (см. раздел 6.7 [Специальные имена файлов
в gawk], стр. 72).
Синтаксически
неправильные одно-символьные программы имеют тенденцию переполнять
стек разбора и генерируют бесполезные сообщения. К удивлению,
такие программы в самом общем случае трудно поддаются
диагнозированию, и эффект от него не стоит затраченного труда.
|