Руководство пользователя для 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).

Синтаксически неправильные одно-символьные программы имеют тенденцию переполнять стек разбора и генерируют бесполезные сообщения. К удивлению, такие программы в самом общем случае трудно поддаются диагнозированию, и эффект от него не стоит затраченного труда.

В начало страницы

<<< Оглавление Страницы: 14  15 >>>