1700436930
1700436931
贝尔实验室并不是什么神秘的机密机构,学生们知道,他们使用的软件和教材来源于这里。潜在的新员工可以看到好作品正在被研究和发表,他们不必担心自己泯然于“工业”研究实验室里。这使贝尔实验室拥有与高校同等的招聘优势。而且,人们可以在实验室全职从事研究工作,不必像在高校那样分心于教学、管理和资金筹集。伟大的软件结合有影响力的书籍,是当时实验室如此成功的重要原因。
1700436932
1700436933
第三个因素比较技术性:作为编程环境的C语言和Unix,作为科研部门的文档编写,作为主要活动的计算机技术主题写作,三者之间存在共生关系。这是从道格·麦基尔罗伊的Roff、乔·奥桑纳的Nroff和Troff等文本格式化程序开始的,然后是Eqn、Tbl等预处理程序。有了这些工具,更加容易制作包含数学符号、表格、图片、图表、图等不易排版内容的文档。这反过来又催生了更好的写作,因为所有这些文档编制程序都有个重要特点:可以借助它们轻易地反复修改文档,并始终有一份整洁的副本,而不必经历将材料交给打字员然后等上好几天这种痛苦而缓慢的过程。
1700436934
1700436935
这可能听起来没什么了不起,但我确信,能够如此轻松地进行修改,写作就更加出色,因为制作最新书版的开销几乎完全消除了,而且完全摈弃了打字员、编辑和打印机等中间环节。技术文档和Unix程序员手册看重准确性,但书籍更看重整个过程的控制。对于编程书籍来说,程序直接用源代码排版至关重要,这样我们就可以确定打印出来的东西是正确的,没有被人为干预无意中改变。
1700436936
1700436937
当然,这些工具都用C语言编写,因为C语言表达力强,效率高。也许,今天不会有很多人记得,当机器容量以千字节而不是千兆字节为单位时,时间和空间的利用效率乃是重中之重。每个字节都得斟酌使用,所以在某种程度上,每条指令也得再三推敲,因此,一种能在这两方面都节约的语言不仅优秀,而且是实际需要。
1700436938
1700436939
本书使用上述文档编制工具的衍生程序制作,形成了圆满的闭环。本书还用了詹姆斯·克拉克(James Clark)编写的Groff、Geqn等出色的新实现和增强功能。
1700436940
1700436941
1700436942
1700436943
1700436945
UNIX传奇:历史与回忆 5.4 sed和awk
1700436946
1700436947
Unix文件系统的主要简化之一是将文件统统看作为未经解释的字节序列。没有记录,没有必需或禁止的字符,也没有文件系统强加的内部结构,只有字节。
1700436948
1700436949
大多数Unix程序处理文本数据的方式也同等简单。文本文件只是字节序列,恰好是ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)中的字符。统一的纯文本视角天然适合于管道。Unix工具箱中装满了读取文本输入、对其进行处理并输出文本的程序。上文已提到一些例子,如计词、比较、排序、翻译和查找重复内容,当然还有那个典型的例子,用于检索的grep。
1700436950
1700436951
1. sed
1700436952
1700436953
1700436954
1700436955
1700436956
1700436957
grep大获成功,李·麦克马洪受到启发,写了类似程序gres,它可以在文本流过时进行简单替换;“gres”末尾那个“s”代表ed中的替换命令。李很快就写出通用的流编辑器sed,取代了gres。sed在文本从输入到输出的过程中应用一系列编辑命令,grep和gres都是sed的特例。sed使用的命令与标准ed文本编辑器中的编辑命令相同。今天,sed在shell脚本中经常被用于以某种方式转换数据流:替换字符,添加或删除不需要的空格,或丢弃不需要的东西。
1700436958
1700436959
李经历非凡——他是哈佛大学的心理学博士,曾在耶稣会神学院学习,准备成为神职人员,后来却踏上了更世俗化的计算机科学家之路。他是Unix小组中最早思考大规模处理文本的人之一,而当时主存储器还处于小到根本无法存储大量文本的阶段。多说一句,“大量”是相对而言。李在20世纪70年代初对《联邦论:美国宪法述评》(Federalist Papers)特别感兴趣,文集中所有文章加起来总共只有1 MB多一点。
1700436960
1700436961
2. awk
1700436962
1700436963
1700436964
1700436965
1700436966
1700436967
我对能同时处理数字和文本的工具很感兴趣。grep和sed都不能处理数字数据或进行计算,grep也不能处理多行文本,这类运算仍然需要C语言程序。我想找一种通用方案。与此同时,阿尔·阿霍(图5-14)一直在试验支持比grep更丰富的正则表达式类别的方法,并编写了egrep(“扩展grep”,extended grep)。彼得·温伯格对数据库感兴趣,他不久后调入1127中心,搬到我和阿尔之间的办公室。
1700436968
1700436969
1700436970
1700436971
1700436972
图5-14 阿尔·阿霍,约1981年(杰勒德·霍尔兹曼供图)
1700436973
1700436974
1977年秋天,我们3个人讨论如何将这些想法结合起来。我们从IBM强大但难以捉摸的报表程序生成器RPG中获得了一些灵感,同时还从马克·罗奇金德(Marc Rochkind)那里得到了一个精妙的点子,在下一章中我会介绍这个点子。最终我们设计出一种语言,起名为AWK(下文写作awk)。正如我们在最初的说明中提到的那样,用作者的名字来命名一门语言是想象力贫乏所致。我不记得我们是否考虑过与awkward[11]相关的同义词,也可能是我们觉得这个名字既风趣又贴切,总之它最后成了程序名。彼得利用Yacc、Lex和阿尔的egrep正则表达式代码,只用了几天时间就写出第一个版本。
1700436975
1700436976
awk程序是模式和动作的序列。每行输入都要测试所有模式,如果模式匹配,则执行相应动作。模式可以是正则表达式,也可以是数字或者字符串关系。不指定模式就会匹配所有行,不指定动作则会输出匹配行。
1700436977
1700436978
下例输出所有长于80个字符的输入行,该模式没有指定动作。
1700436979
[
上一页 ]
[ :1.70043693e+09 ]
[
下一页 ]