После двух лет разработки и спустя десять лет после формирования прошлой стабильной ветки 3.1 представлен новый значительный релиз реализации языка программирования AWK от проекта GNU - Gawk 4.0.0. Язык был разработан в 70-х годах прошлого века и не претерпел значительных изменений с середины 80-х годов, в которых был определен основной костяк AWK, что позволило на протяжении последних десятилетий сохранить первозданную стабильность и простоту языка. Несмотря на преклонный возраст, AWK до сих пор активно используется администраторами для выполнения рутинных работ, связанных с парсингом различного рода текстовых файлов и генерации несложной результирующей статистики.

В новой версии устранены некоторое слабые стороны Gawk и отражены современные реалии. Из добавленных улучшений можно отметить:

  • Переработана внутренняя архитектура, проведена чистка кода и изменен метод генерации байткода, что в сумме, возможно, положительно сказалось на производительности;
  • Отладчик dgawk, напоминающий GDB;
  • Возможность включения кода из внешних файлов;
  • Поддержка косвенного вызова функций, что позволяет привязать функцию-обработчик к определенному строковому значению, т.е. избежать череды проверок if-else за счет использования конструкций вида "result = @the_func()", где "the_func" переменная, в которой содержится имя вызываемой функции;
  • Реализация шаблонов BEGINFILE и ENDFILE, позволяющих выполнить код перед открытием и после завершения обработки очередного файла (имя файла передается через переменную FILENAME). Используя BEGINFILE, например, можно проверить права доступа к файлу или предпринять какие-то действия перед началом парсинга;
  • Поддержка IPv6 через специальный файл /inet6/...;;
  • Возможность создания вложенных массивов, в которых элементом массива может выступать другой массив;
  • Реализация режима изолированного выполнения (опция --sandbox), при котором запрещено выполнение функции system(), перенаправление ввода и вывода, динамическая загрузка расширений. Опцию можно применять в случае, когда нужно запустить скрипт, полученный из сомнительных источников;
  • Включение по умолчанию switch/case (раньше нужно было собирать gawk с указанием специальной опции в configure);
  • Удалена поддержка устаревших платформ, среди которых Atari, Amiga, BeOS, Cray, MIPS RiscOS, MS-DOS и Windows c использованием компилятора от Microsoft, NeXT, SunOS 3.x;
  • В регулярных выражениях добавлена поддержка указания интервалов и возможность использования масок "\s" и "\S";
  • Добавлена новая переменная FPAT, позволяющая задать определяющее поля регулярное выражение, вместо использования разделителя полей. Добавлена новая функция patsplit(), которая позиционируется как аналог split() с реализацией данной функциональности;
  • В функции split() добавлена поддержка четвертого опционального аргумента с массивом для сохранения разделителей;
  • Новая опция "--characters-as-bytes" ("-b") для принудительной интерпретации входных данных как строк из однобайтовых символов;
  • Директивы "break" и "continue" отныне нельзя использовать вне циклов, за исключением вызова скрипта с опцией "--traditional";
  • Добавлена функция isarray() для проверки, является ли аргумент массивом (упрощает реализацию перебора вложенных массивов);
  • В функции asort() и asorti() добавлена поддержка третьего аргумента, задающего метод сортировки.


Источник: http://www.opennet.ru/opennews/art.shtml?num=31067