После двух лет разработки и спустя десять лет после формирования прошлой стабильной ветки 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;
- Возможность создания вложенных массивов, например, ‘foo[5,12] = «value»‘;
- Реализация режима изолированного выполнения (опция —sandbox), при котором запрещено выполнение функции system(), перенаправление ввода и вывода, динамическая загрузка расширений. Опцию можно применять в случае, когда нужно запустить скрипт, полученный из сомнительных источников;
- Включение по умолчанию switch/case (раньше нужно было собирать gawk с указанием специальной опции в configure);
- Удалена поддержка устаревших платформ, среди которых Atari, Amiga, BeOS, Cray, MIPS RiscOS, MS-DOS и Windows c использованием Microsoft Compiler, NeXT, SunOS 3.x;
- В регулярных выражениях добавлена поддержка указания интервалов и возможность использования масок «s» и «S»;
- Добавлена новая переменная FPAT, позволяющая задать определяющее поля регулярное выражение, вместо использования разделителя полей. Добавлена новая функция patsplit(), которая позиционируется как аналог split() с реализацией данной функциональности;
- В функции split() добавлена поддержка четвертого опционального аргумента с массивом для сохранения разделителей;
- Новая опция «—characters-as-bytes» («-b») для принудительной интерпретации входных данных как строк из однобайтовых символов;
- Директивы «break» и «continue» отныне нельзя использовать вне циклов, за исключением вызова скрипта с опцией «—traditional»;
- Добавлена функция isarray() для проверки, является ли аргумент массивом (упрощает реализацию перебора вложенных массивов);
- В функции asort() и asorti() добавлена поддержка третьего аргумента, задающего метод сортировки.
