我应该总是使用GAWK AWK?

我发现AWK的所有function都包含在GAWK中,除了使用没有安装GAWK的系统之外,是否有一个很好的理由使用AWK和GAWK? AWK比GAWK有更好的性能吗?

awk可以指很多东西。 有很多的标准 ,有很多不同的实现,其中之一是gawk

不使用特定于实现的功能意味着您的代码在awk -the-language的其他实现上将保持不变。

gawkawk -the-language的一个实现,声称符合awk -the-standard,同时增加了一些额外的功能。

 $ man awk … DESCRIPTION Gawk is the GNU Project's implementation of the AWK programming language. It conforms to the definition of the language in the POSIX 1003.1 Standard. This version in turn is based on the description in The AWK Programming Language, by Aho, coreighan, and Weinberger. Gawk provides the additional features found in the current version of Brian coreighan's awk and a number of GNU-specific extensions. … 

至于速度,使用gawk作为“普通”的awk应该没有什么区别 – 通常,当安装gawk时, awk只是与gawk的符号链接,这意味着它们将是完全相同的程序。

然而,使用特定于gawk功能将意味着你将被锁定到特定的实现 – 所以如果(假设)你会发现一个更快的实现,你可能不得不适应你的脚本,而不是只是交换出二进制。 (可能有更快的实现,但我不知道,因为我从来没有需要使我的awk脚本运行得更快。)

就个人而言,我倾向于坚持使用“普通”的awk ,而不使用特定于gawk特性,但是如果您不关心切换到其他实现,那么使用gawk扩展可能会使您的脚本更容易编写并为此节省时间。

假设“AWK”表示任何不是gawk的awk – 不。总是尽可能使用gawk。 如果它不在您的系统上,请安装它。

现在AWK的最常见的实现是gawk,可能是第二个最常见的是mawk,至少因为它是Debian上的AWK系统。

引用apt-cache show mawk的输出

Mawk比gawk更小更快。 它有一些编译时间限制,例如NF = 32767和sprintf缓冲区= 1020。

在gawk方面,有很多精心设计的扩展,我认为更好的错误管理和更好的错误信息,在调试一个复杂的脚本时是一个真正的好处,可能是一个很好的理由gawk,即使你对它的扩展不感兴趣。

另一方面,如果你有一个调试脚本,如果你不需要一个特定的扩展,如果你可以忍受mawk的内置限制(这是很多的ifs),你想挤没有性能的最后一点离开AWK的舒适,那么mawk就是要走的路。