Gawk 4.0.0


http://lwn.net/Articles/450631/
July 7, 2011
This article was contributed by Joe 'Zonker' Brockmeier.

翻译:史玉良/李凯

GNU Awk(简称Gawk)是一款通常不会有什么新消息的常用工具。不过其4.0.0发行版却值得期待。Gawk 6月30日宣布,最新版会引入Gawk的首款调试器、用于运行不信任脚本的沙箱模型、内部修订、大量改动的正则表达式以及对IPv6的兼容性。

Gawk是Awk的GNU版本。Awk的名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。它是一个作为跨UNIX平台标准的脚本语言,我这里所说的“标准”是指Awk从一开始就已经成为了标准UNIX系统(或类似UNIX的系统)的一部分,同时它还是由开放组织所提出的POSIX规范的一部分。虽然Gawk只是Awk众多版本之一,但由于广泛应用而脱颖而出。那么它是用来做什么的呢?Gawk虽然也有人用它编写IRC机器人YouTube下载器、甚至AI编程,但它最著名的是数据处理和分析。

4.0.0中的新特性

Gawk4.0.0较之3.1.8版本有很大的更新。根据发布公告,Gawk不只是封装了大量的新特性、bug修复以及为符合POSIX2008版而做的更新,还包含了一些“内部大修”。

为了找出哪些被更新了以及为什么要更新这些部分,我给Gawk的维护者Arnold Robbins发了封Email。事实表明,这次内部大修有着漫长的历史。Robbins说在几年前John Haque开始用一种字节码引擎来重写Gawk的内核,并且在此过程中引入了一个调试器。不幸的是这项工作并没有被集成进来,并且Haque也转到了其他的工作。在2010年初,Robbins开始尝试把Haque的代码更新到现有程序中。据Robbins说,这次的重写并不会带来性能上的很大改进,不过却引入了一个非常有用的特性:


“性能跟以前的内核相比基本一致(或者略好一些),到目前为止我还没有找到一个case来验证这次改写使得它性能变差了。但是确实因此得到了巨大的好处,这也是为什么我想要做这次改进,gawk现在可以提供一个awk级的调试器(类似于GDB)了。”

目前,dgawk 是可用的,但功能受限的。它还不能报告一个错误是什么,当存在问题时只会报告一个“语法错误”。该调试器只能在命令行运行程序时使用,也就是说它不能 attach 到一个运行的Awk程序中。Gawk的开发者们不大可能去添加这项功能,因为Gawk手册中提到,必须用 dgawk 启动程序,才能进行调试,“对于一个主要用于快速执行以及简短程序的编程语言这貌似更加合理的”。

在4.0.0中Gawk的正则表达式发生了一些变化。区间表达式现在成了Gawk默认语法的一部分,并且不再需要 -W或 -POSIX选项了。区间表达式—— 大括号中包含一个或两个数字(形如{n}或{n,m})来告诉Gawk匹配正则表达式n或者从n到m——不再是初始Awk规范的一部分了。此外,\s和\S被加了进来,分别用于匹配任何空白字符和任何不含空白的字符。

虽然Gawk努力兼容POSIX,但它确实有超出POSIX的功能——在4.0.0版本中又引入了一些。Gawk现在支持两种模式,BEGINFILE和ENDFILE,它们分别用于在读取文件之前执行操作以及在读取文件之后执行操作。和BEGIN/END规则类似,不过用于读取每个文件之前和之后(由于Gawk在运行给定脚本时可能会处理两个或更多的文件)。例如,Gawk程序现在可以在处理一个文件之前可以先测试一下文件的可读性。在早期的Gawk版本中是没有这项功能的——因此如果Gawk接收的文件是不可读取的那么一个脚本就会引发一个致命的错误。

Gawk很早就可以用于处理网络连接。在4.0.0版本中,Gawk通过使用/inet6 或 /inet4来强制使用特定协议

网络上充斥着Awk/Gawk脚本,用户可能想要运行这些脚本但又担心的这些脚本会比所宣传的做的更多。为了解决这个问题,Gawk4.0.0中引入了沙箱选项(--sandbox),用于约束Gawk操作特定的输入数据。这项功能是通过禁用Gawk中的system()函数、使用getline的输入重定向以及使用print和printf函数的输出重定向来实现的。

然而,Robbins告诫不要对其表现出的安全性过分相信:


该功能是由一个有特定需要的同志贡献的代码,就我个人观点,如果用 gawk 开发 Web CGI 脚本,此功能很有意义。用户绝不希望 CGI 处理恶意数据的时候被欺骗而导致被注入攻击。从某些方面看沙盒是有意义的,但这个功能不能做出真正的安全承诺。

Robbins说沙箱模式在默认情况下是不开启的,因为这将打破“无数现有的awk脚本”。总之,这个选项是有用的,但沙箱选项禁用的功能可能不是恶意脚本损坏用户系统的唯一方式。

4.0.0版本是一些选项和一些旧的不支持的操作系统的终点。--compat,--copyleft,以及--usage等冗余选项都将消失。由于没有被实现,原始套接字选项已经被移除。如果仍然使用Amiga, BeOS, Cray, NeXT, SunOS 3.x, MIPS RiscOS以及其它少数的操作系统,, Gawk 3.1.8是最后能在其上运行的版本。Gawk的团队已取消这些平台的支持其实并不奇怪---因为他们维护的版本已经过期很久了。如今去找一款支持BeOS或者Amiga的专有软件确实是件很有挑战性的事情。

随着Gawk 4.0.0的发行,Robbins说接下来的大项目是把Gawk的三个可执行文件合并为一个版本以此来降低安装空间(gawk、pgawk 用来做profiling、dgawk)。他同时也指出,“针对性能方面,Haque有一些其他的计划,但是我在公共场合只能说这些。”Robbins同时也透漏,计划融入一些XMLgawk扩展(XMLgawk是Gawk的一个扩展,它有一个基于Expat XML程序的XML解析库)。

在Robbins的网站上,还有一些观点列在列在Gawk的路线图上,这其中包括对多精度浮点数MPFR的支持,因此gawk可以使用无限精度的数这字。他指出这会是一项“大工程”,而且还要决定是否默认支持MPFR。Gawk 的理念是代码准备好了才发布,所以对于什么时候Gawk能够具有人们所期望的一些特征,目前来看还没有确切的日期。

Gawk的团队不大,但是他们却是一群核心贡献者支持社区健康运行。Robbins说Gawk团队有六位成员维护着不同的系统,一个测试无数不同的Unix系统,一个贡献者已经帮助完成了文档,还有许多其他人诸如xmlgawk开发者以及来自不同的GNU/Linux发行商。自然的,这还包括Robbins和Haque。

虽然在这些年来Awk不是一种特别性感的语言,但是对于系统管理员以及开发者来说它仍然是一个日常工具。很高兴看到GNU 项目不仅在维护Gawk,还增加一些有趣的新特性来帮助其维护相关的功能。

Topic: sohulinux