Руководство
пользователя для GNU Awk
Arnold
D. Robbins
перевод Балуева А. Н.
Оглавление
17.
Эволюция языка awk
В
этой книге описана реализация GNU языка awk, которая следует
спецификациям POSIX. Многие пользователи awk знакомы только с
оригинальной реализацией awk в версии Version 7 Unix. (Эта
реализация была базисом для awk в Berkeley Unix через 4.3-Reno.
Выпуск 4.4 Berkeley Unix использует gawk 2.15.2 для их версии
awk.) Настоящая глава коротко описывает эволюцию языка awk, с
ссылками на другие части книги, где вы можете найти больше
информации.
17.1
Главные различия между V7 и SVR3.1
Язык
awk развивался в основном между выпуском версии 7 Unix (1978) и
новой версией, впервые ставшей общедоступной в System V Release
3.1 (1987). В этом разделе подводятся итоги изменениям с отсылкой
за деталями к другим разделам книги.
Требование
`;' для разделения правил в строке (см, раздел 2.6 [операторы awk
и строки], стр. 17).
Определенные
пользователем функции и операторы return (см. главу 13 [Функции,
определенные пользователем], стр. 153).
Оператор
delete (см. раздел 11.6 [Оператор delete], стр. 128).
Операторы
do-while (см. раздел 9.3 [Операторы do-while], стр. 106).
Встроенные
функции atan2, cos, sin, rand и srand (см. раздел 12.2
[Числовые
встроенные функции], стр. 136).
Встроенные
функции gsub, sub и match (см, раздел 12.3 [Встроенные функции для
действий с цепочками], стр. 137).
Встроенные
функции close и system (см. раздел 12.4 [Встроенные функции
ввода/вывода], стр. 146).
Встроенные
переменные ARGC, ARGV, FNR, RLENGTH, RSTART и SUBSEP (см. главу 10
[Встроенные переменные], стр. 115).
Условные
выражения с трехзначным оператором `?:' (см. раздел 7.12 Условные
выражения], стр. 92).
Экспоненциальный
оператор `^' (см. раздел 7.5 [Арифметические операторы], стр. 82)
и его оператор присваивания `^=' (см. раздел 7.7 [Присваивающие
выражения], стр., 84).
Cи-совместимый
приоритет операторов, нарушающий некоторые старые awk-программы
(см. раздел 7.14 [Приоритет операторов (Последовательность их
выполнения)], стр. 94).
Регулярные
выражения (Regexps) как значение FS (см. раздел 5.5 [Спецификация
того, как разделяются поля], стр. 44), и как третий аргумент
функции split (см. раздел 12.3 [Встроенные функции для действий с
цепочками], стр. 137).
Динамические
regexps как операнды операторов `~' и `!~' (см. раздел 4.1 [Как
употреблять регулярные выражения], стр. 23).
Управляющие
последовательности `"b', `"f' и `"r' (см. раздел
4.2 [Управляющие последовательности], стр.24). (Некоторые
поставщики исправляют свои старые версии awk для обнаружения `"r',
`"b' и `"f', но на это не стоит полагаться.
Перенаправление
ввода для функции getline (см. раздел 5.8 [Явный ввод по getline],
стр. 53). Кратные BEGIN и END правила (см. раздел 8.1.5
[Специальные образцы BEGIN и END], стр. 100). Многомерные массивы
(см. раздел 11.9 [Многомерные массивы], стр. 130).
17.2
Изменения от SVR3.1 к SVR4
Выпуск
4 системы V версии Unix awk добавил следующие возможности
(некоторые из них возникли в gawk):
Переменная
ENVIRON (см. главу 10 [Встроенные переменные], стр. 115).
Кратные
параметры `-f' в командной строке (см. раздел 14.1 [Параметры
командной строки], стр. 161).
Параметр
`-v' для присваивания значений переменным до начала выполнения
программы (см. раздел 14.1 [Параметры командной строки], стр.
161).
Параметр
`--' для завершения параметров в командной строке.
Управляющие
последовательности `"a', `"v' и `"x' (см, раздел
4.2 [Управляющие последовательности], стр. 24).
Определенное
возвращаемое значение для встроенной функции srand (см. раздел
12.2 [Численные встроенные функции], стр. 136).
Встроенные
цепочечные функции toupper и tolower для изменения регистров (см.
раздел 12.3 [Встроенные функции для действий с цепочками], стр.
137).
Указания
по очистке для буквы `%c' контроля формата в функции printf (см.
раздел 6.5.2 [Буквы управления форматом], стр. 65).
Способность
динамической передачи ширины поля и точности ("%*.*d") в
списке аргументов функции printf (см. раздел 6.5.2 [Буквы
управления форматом], стр. 65).
Употребление
констант regexp, таких как /foo/, в качестве выражений, где они
эквивалентны употреблению операторов соответствия, как в `$0 ~
/foo/' (см. раздел 7.2 [Использование констант регулярных
выражений], стр. 78).
17.3
Расхождения между SVR4 и POSIX awk
Командный
язык POSIX и стандартные утилиты для awk внесли следующие
изменения в язык:
Употребление
`-W' для специальных параметров реализации.
Использование
CONVFMT для управления переходом чисел в цепочки (см. раздел 7.4
[Преобразования чисел в цепочки], стр. 81).
Понятие
числовых цепочек и уточнение правил сравнения для них (см. раздел
7.10 [Печать переменных и сравнительные выражения], стр. 88).
Более
полная документация многих, не документированных ранее
особенностей языка.
Следующие
ниже обычные расширения не допускаются стандартом POSIX:
Управляющие
последовательности "x не опознаются (см. раздел 4.2
[Управляющие последовательности], стр. 24).
Символы
newlines не действуют как whitespace для разделения полей, когда
FS равна одному пробелу.
Синоним
func для функции keyword не опознается (see раздел 13.1 [синтаксис
определения функций], стр. 153).
Операторы
`**' и `**=' не могут использоваться вместо `^' и `^=' (см. раздел
7.5 [Арифметические операторы], стр. 82, также см. раздел 7.7
[Присваивающие выражения], стр. 84).
Спецификация
`-Ft' в командной строке не устанавливает значение FS равным
одному символу tab (см. раздел 5.5 [Спецификации для разделения
полей], стр. 44).
Встроенная
функция ush не поддерживается (см. раздел 12.4 [Встроенные функции
для ввода/вывода], стр. 146).
17.4
Расширения в Bell Laboratories awk
Brian
Kernighan, один из проектировщиков Unix awk, сделал свою версию
доступной через анонимный ftp (См. раздел B.8 [Другие свободно
доступные реализации awk, стр. 293). В этом разделе описываются
расширения его версии awk, которые не входят в POSIX awk.
Параметры
командной строки `-mf NNN ' и `-mr NNN ' , предназначенные
соответственно для установки максимального количества полей и
максимального размера записи (см. раздел 14.1 [Параметры командной
строки], сто. 161). Встроенная функция ush для смещения
буферизованного вывода (см. раздел 12.4 [Встроенные функции для
ввода/вывода], стр. 146).
17.5
Расширения в gawk, не входящие в POSIX awk
Реализация
GNU, gawk, имеет ряд дополнительных особенностей. В этом разделе
мы перечислим их в порядке внесения их в gawk. Они все могут быть
выключены параметрами либо `--traditional' либо `--posix' (см.
раздел 14.1 [Параметры командной строки], стр. 161).
В
версии 2.10 gawk введены следующие дополнения:
Переменная
окружения AWKPATH для спецификации поиска пути для параметра `-f'
командной строки (см. раздел 14.1 [Параметры командной строки],
стр. 161).
Переменная
IGNORECASE и ее воздействие (см. раздел 4.5 [Чувствительность к
регистру в соответствиях], стр. 33). Интерпретация файловых имен
`/dev/stdin', `/dev/stdout', `/dev/stderr' и `/dev/fd/n' (см.
раздел 6.7 [Специальные имена файлов в gawk], стр. 72).
Версия
2.13 gawk вводит следующие дополнения: Переменная FIELDWIDTHS и ее
действия (см. раздел 5.6 [Чтение данных фиксированной ширины],
стр. 49).
Встроенные
функции systime и strftime для получения и печати отметок времени
(см. раздел 12.5 [Функции для действий с отметками времени], стр.
148).
Параметр
`-W lint' для выдачи исходного кода, динамических ошибок и
проверки переносимости (см. раздел 14.1 [Параметры командной
строки], стр. 161).
Параметр
`-W compat' для выключения перечисленных расширений (см. раздел
14.1 [Параметры командной строки], стр. 161).
Параметр
`-W posix' для полной совместимости с соглашениями POSIX (см.
раздел 14.1 [Параметры командной строки], стр. 161).
Версия
2.14 gawk вводит следующие особенности: Оператор next file для
перехода к следующему файлу с данными (см. раздел 9.8 [Оператор
nextfile], стр. 112).
Версия
2.15 gawk вводит следующие расширения: Переменная ARGIND, которая
следит за движением FILENAME сквозь ARGV (см. Главу 10 [Встроенные
переменные], стр. 115).
Переменная
ERRNO, которая содержит системное сообщение об ошибке,
возвращаемое командой \Gamma 1, или когда закрывается файл (см.
главу 10 [Встроенные переменные], стр. 115).
Способность
использовать параметры стиля GNU с длинными именами, которые
начинаются с `--' (см. раздел 14.1 [Параметры командной строки],
стр. 161).
Параметр
`--source' для смешивания кода из командной строки с библиотечным
файлом исходного кода (см. раздел 14.1 [Параметры командной
строки], стр. 161).
Интерпретация
файловых имен `/dev/pid', `/dev/ppid', `/dev/pgrpid' и `/dev/user'
(см. раздел 6.7 [Специальные имена файлов в gawk], стр. 72).
Версия
3.0 gawk вводит следующие расширения: Оператор next file
превращается в nextfile (см. раздел 9.8 [Оператор nextfile], стр.
112).
Параметр
`--lint-old' для предупреждения о конструкциях, не поддерживаемых
оригинальной версией 7 Unix version of awk (см. раздел 17.1
[Главные различия между V7 и SVR3.1], стр. 253).
Параметр
`--traditional' был добавлен как лучшее имя для `--compat' (см.
раздел 14.1 [Параметры командной строки], стр. 161).
Возможность
для FS быть пустой строкой, и для третьего аргумента split быть
пустой строкой (см. раздел 5.5.3 [Превращение каждого символа в
отдельное поле], стр. 46).
Возможность
для RS быть regexp (см. раздел 5.1 [Как ввод делится на записи],
стр. 37).
Переменная
RT (см. раздел 5.1 [Как ввод разделяется на записи], стр. 37).
Функция gensub для расширения действий с текстом (см. раздел 12.3
[Встроенные функции для действий с цепочками], стр. 137).
Функция
strftime приобретает формат времени по умолчанию, позволяя вызов
без аргументов (см. раздел 12.5 [Функции для действий с отметками
времени], стр. 148).
Полная
поддержка для POSIX и GNU regexps (см. глава 4 [Регулярные
выражения], стр. 23).
Параметр
`--re-interval' для обеспечения интервальных выражений в regexps
(см. раздел 4.3 [Операторы регулярных выражений], стр. 26).
Изменен
IGNORECASE, теперь он применим для сравнения цепочек также как
операции regexp (см. раздел Section 4.5 [Чувствительность к
регистру при определении соответствия], page 33).
Параметр
`-m' и функция ush из Bell Labs research версии awk (см. раздел
14.1 [Параметры командной строки], стр. 161; см. также раздел 12.4
[Встроенные функции для ввода/вывода], стр. 146).
Использование
GNU Autoconf для управления конфигурационным процессом (см. раздел
B.2.1 [Компиляция gawk для Unix], стр. 284). Поддержка Amiga (см.
раздел B.6 [Установка gawk на Amiga], стр. 291).
|