《The AWK Programming Language》前言

前言
计算机用户花费大量的时间进行简单的,机械的数据操作--改变数据格式,核对它的有效性,找寻有特性的项目,求和,打印报告等等。所有这些工作都应该机械化。但是,每当有这样的任务,就要用C或者Pascal语言写一个特殊任务的程序真是一件令人讨厌的事。

AWK是一种编程语言,它使得利用很短的,常常是一两行的程序来完成这些任务成为可能。一段AWK程序就是一系列的模式和操作,它说明在输入数据中寻找什么以及找到之后干什么。AWK在文件中搜寻与任一模式匹配的行,当一个匹配的行被发现之后,对应的操作即被执行。一个模式可以通过联合正则表达式和比较运算对字符串,数字,字段,变量和数组元素做行选择。操作可以对选定的行进行任意的处理。操作语言看起来像C但是没有声明,而且字符串和数字是内建的数据类型。

AWK扫描输入文件并且把每一输入行自动地分成字段。因为这么多事情是自动的--输入,字段分割,存储管理,和初始化--AWK程序通常都比它们在更常规的语言中短的多。因此AWK的一项通常的应用就是上述建议的数据操作。一两行的程序,由键盘键入,运行一次,然后丢掉。但事实上,AWK是一种普通的编程工具,它可以取代很多特殊的工具和程序。

表达的简洁和操作的便利使得AWK对原型化较大的程序特有价值。从几行开始,然后调试程序直到它能完成要求的工作,通过快速地试行不同的选择验证不同的设计。因为程序很短,既便于起步,也容易按照经验从不同的方向重新开始。一旦设计是正确的,也可以很直接地从AWK转换到其他语言。

本书的架构

本书的第一个目标是告诉你AWK是什么以及如何有效地使用它。第一章是一个关于起步的最低要求的教程。只需要读几页,你就应该有足够的信息写一段有用的程序。这一章的例子非常短小简单,是AWK交互应用的典型。

第二章按系统顺序论述整个语言。虽然这一章有很多例子,但却像很多手册一样又长又干涩。所以第一次读的时候你可能只想浏览一下它。

本书的其它部分包含多种例子,选来展示AWK的应用的宽泛以及如何更好地利用它的各种功能。有些例子是在我们的环境中经常用到的; 有些只是展示想法而不具有实际的应用;还有一些只是因为它们好玩。

第三章的重点是数据的检索,变换,减少和验证--AWK最初正是为这些任务设计的。还有一个关于如何处理像地址这样自然有多行体组成的列单的论述。

AWK是一种适用于管理小型的个人数据库的语言。第四章论述数据库报告的产生,建立简单的关系型数据库系统以及对储存在多个文件的数据的询问。

AWK能够几乎以多数语言处理数字一样的便利来处理文本文件,所以经常发现它在文本处理中的应用。第五章论述了产生文本,以及一些帮助准备文件的程序。其中一个例子是基于用于本书的一个程序的一段索引程序。

第六章是关于“小语言”,也就是专注于窄小领域的特殊语言。因为它的基本操作支持翻译过程中碰到的很多文字和表格管理任务,AWK便于编写短小的翻译器程序。这一章包括一个编译器,一个图形语言,和几个计算器。

AWK是一种很好的表达某些算法的语言。 因为没有声明,也因为存储管理容易,一段AWK程序有很多伪代码的优势,而且AWK能够运行,而伪代码不可以。第七章关注于算法试验,包括测试和表现评价。它展示了几个排序算法,以及几个在一个Unix make程序版本中的高潮。

第八章谈到AWK之所以是AWK的一些历史原因,也提供一些当它太慢或太受局限时做什么的建议。

附录A是这个语言的总结。附录B包含某些选定的练习的答案。

你应该从第一章开始,然后试一些你自己的小例子。快速通过第二章,只关注总结和表格;不要陷入细节的沼泽。然后按照你的兴趣的大小读下面的章节。每个章节几乎是独立的,所以不需要太注重阅读次序。

关于例子

这些例子有几个不同的主题。当然最主要的一个是说明如何用好AWK。我们已经试着包括各种不同的结构,我们也已经强调了特别的方面,如关联数组,以及常用于AWK编程的正则表达式。

第二个主题是展示AWK的多功能性。AWK程序已经被用于从数据库到电路设计,从数字分析到图形,从编译到系统管理,从为非程序员开发的第一种语言到软件工程课程的必修语言。我们希望本书展示的应用的多样性也能给你带来新的可能性。

第三个主题是展示普通的计算机操作是如何实现的。本书包含一个关系数据库系统,一个玩具计算机的编译器和翻译器,一个图形绘画语言,一个用于AWK子集的递归-下降解析器,一个基于make的文件-更新程序和其它很多例子。在每个案例中,一段短小的AWK程序以一种你能明白和玩作的形式给出它如何工作的核心内容。

我们也已经试着图解一系列方法去解决编程问题。快速原型化是一种AWK很支持的方法。一个不太明显的策略是分而歼之:把大的工作分成小的部分,每一小部分集中解决问题的一个方面。另一个策略是编写产生其它程序的程序。 小语言能定义好的用户界面并常常带来坚实的实现。虽然这些理念展现在这里AWK的上下文中,它们是普遍适用的,而且应该成为每一个程序员技能的一部分。

这些例子是机器可读文本,并全部直接测试过。我们已经试着让我们的程序零差错, 但是我们还没有增加特色也没有试过所有可能的非法输入,只是专注于提供最核心的部分。

AWK语言的演进

AWK最初是由作者于1977年作为一个实验的一部分设计和实现的,这个实验是关于如何产生Unix工具grep和sed来处理数字和文本。它基于我们对正则表达式和可编程编辑器的兴趣。虽然本来是为了写短小的程序,但是它对工具的整合使它很快吸引了那些写大程序的用户。 这些大程序需要一些初版并不包含的特性,所以AWK的一个加强的新版本在1985年面世了。

主要的新特性是用户能够定义他们自己的函数。其它增强包括有文本替换和模式-匹配功能的动态正则表达式;附加的内建函数和变量;一些新的运算符和表述;多文件输入;访问命令行参数。出错信息也被改进了。第一章的例子只用到最初版本的工具;后面章节中的例子则利用了新的特性。

这个AWK版本只是Unix系统V Release 3.1的一部分。这个版本的源代码也可以通过AT&T's Unix系统工具软件分布系统得到。

因为AWK是在Unix系统下开发的,所以它的某些特性只反映了它在那个系统下通常能发现的能力;这些特性在我们的某些例子中用到了。另外我们假设了某些Unix工具的存在,特别是sort, 因为完全相同的东西可能在其它地方是不存在的。除了这些限制,AWK应该在任何环境在都是可用的;特别是它在MS—DOS上运行。更多的信息可以从Addison-Wesley得到。

AWK一定是不完美的;它有它的不规则,遗漏和简单的蠢想法,而且有时候慢的蛋疼。但是它也是一个丰富的便利的语言,在相当多的案例中是有用的。我们希望你也能像我们一样发现它是有价值的。

致谢

我们非常地感激那些对本书的手稿给出评论和建议的朋友们。我们特别感谢Jon Bentley,他的热情激励我们很多年。Jon贡献了很多来自于他使用和教授AWK的经验的想法和程序;他也很细心地阅读了多个手稿。Doug McIlroy 也值得特别承认;他作为读者的无与伦比的天才极大地改善了整本书的结构和内容。其它对手稿提出建言的包括Susan Aho, Jaap Akkerhuis, Lorinda Cherry, Chris Fraser, Eric Grosse, Riccardo Gusella, Bob Herbst, Mark Kernighan, John Linderman, Bob Martin, Howard Moscovitz, Gerard Schmitt, Don Swartwout, Howard Trickey, Peter van Ejik, Chris Van Wyk, 和 Mihalis Yannakakis. 我们感谢他们。

Alfred V. Aho
Brian W. Kernighan
Peter J. Weinberger

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值