AWK语言第二版 0.前言

经典书籍在三十五年后的第二版。几个作者应该都是八十来岁的老人了,致敬!

前言

Awk诞生于1977年,是一门简单的程序设计语言,它可以用很短的程序来同时轻松地操作文本和数值。Awk也是一门脚本语言,它遵循了UNIX的哲学(每个程序仅做好一件事,而且多个程序之间能组合起来完成更复杂的工作),填补了UNIX工具在这方面的空缺,并和其他UNIX工具配合地很好。

1977年以来的计算机世界发生了巨大的变化:运算速度、内存大小、程序语言的种类、编程和运行环境、互联网、以及Unicode。

尽管快50岁了,Awk还是作为核心的UNIX工具,广泛使用在UNIX、Linux、Mac甚至是Windows下面。不需要下载或导入,直接用就行。而且它很容易上手,研究几分钟之后就能用它做很多事情了。

1977年时脚本语言是相当少的,而Awk是第一个被广泛使用的脚本语言。其他脚本语言补足了一些Awk没有的功能,有时可以取代Awk。比如10年后即1987年出现的Perl,针对当时Awk的一些限制做了明确的改进。而在Perl出现4年后的Python,目前已经成为最广泛使用的脚本语言了。特别是Python生态系统有大量的库,可供用户来写更大的程序。在Web和一些单独的使用场景,Javascript是首选。其他还有一些小众的语言仍在被大量使用,甚至“shell”本身都出现了多个变种,加上了特别丰富的编程能力。

程序员和计算机用户花大量时间来做简单机械的数据处理——改变数据格式、检查有效性、找到特征项、求和、汇总等等。这些都应该让机器来做的。但是如果每次都为每个特定的任务来写个C或Python程序,那就麻烦死了。

Awk是这样的一门语言,它可用很短的程序(经常是一两行)来完成简单的计算。Awk程序由一系列的“样式”(pattern)和“动作”(action)组成,样式是说要在输入数据里面找什么,动作是说找到之后做什么。Awk处理的是文本文件(word、Pdf之类的不行)。Awk会对每行进行样式匹配,如果找到了匹配的行,就会执行相应的动作。样式可以是多个正则表达式的组合,也可以是对字符串、数字、列、变量和数组的比较操作,以此来选中一行或多行。而动作可以对选中的行做任意的处理;处理的语法看起来像C,但没有声明,而且字符串和数组是内置类型。

Awk扫描输入的文本文件,并自动将每行拆分成列。因为这些全是自动的——输入、列拆分、存储管理、初始化——所以Awk程序通常会比用其他普通语言写的程序短得多。这样Awk通常就被用在前面所说的那些数据处理场景中。一两行的程序,在键盘上敲出来,运行一次,然后就丢了。实际上,Awk是一门通用的程序设计语言,可以用来取代大量的专用工具或程序。

表达的简洁和操作的方便,使Awk能用于大程序的原型设计。从几行代码开始,通过快速切换替代方案来验证设计,精炼程序直到它达到要求。因为程序很短,所以很容易开始,也很容易推倒重来。而且如果设计正确的话,甚至能够直接将Awk翻译成另一种语言。

结构说明

样例说明

Awk的演进

Awk是基于作者们对正则表达式和可编程编辑器的兴趣而产生的。本来AWK应该要全大写的(三个作者姓氏的首字母),但看起来太难受,就都用Awk了。别吐槽我们,说用作者姓氏来命名一门语言太没有想象力了。因为当时真没啥更好的想法,而且正好我们三个坐在相邻的三个办公室(Aho, Weinberger, and Kernighan)

虽然Awk目的是用来写小程序的,但架不住用户觉得好用,写出特别大的程序。但大程序需要的特性是缺失的,所以1985年Awk新版本做了增强。

之后又各种出现了好多版本的Awk,比如Gawk,Mawk,BusyBox Awk,还有Go版本的。这些版本各有小区别但核心语言是一样的。还有不少书介绍Awk,最有名的是《Effective Awk Programming》,书作者也是Gawk的维护者,因此书里也介绍了Gawk。Gawk手册是在线的,写的很仔细。

Awk还有POSIX标准,可惜过时了,各种Awk版本也不完全遵守它。

Unix,Linux和macOS这些系统正常安装完就有Awk,在Windows上要用的话可以通过WSL或者Cygwin。很多网站都可以下载源代码或者编译好的二进制。作者们的版本是放在这里 https://github.com/onetrueawk/awk 。另外还有一个网站可以参考 https://www.awk.dev

这些年来Awk的大部分都没有太大的变化。最大的特性应该是对Unicode的支持:新版本Awk可以处理UTF-8编码。还支持了CSV格式。 用 

awk --version

可以看到你使用的版本,但通常比较老。要用新版本的话得自己去下载安装。

因为Awk是Unix下开发的,所以它的一些特性反映了类Unix系统的能力,例子中会用到。我们也假设你使用的环境有很多配套的工具,比如sort。除了这些限制,Awk在任何环境下都是好用的。

Awk当然不完美。但它优点是功能丰富而且容易学。希望你和作者们一样觉得它好用。

第二版致谢

Arnold Robbins(Gawk的维护者)

Jon Bentley(编程珠玑作者)

Ben Hoyt(Go版本Awk作者)

等等

第一版致谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值