Awk 是一种强大的脚本工具,可以轻松处理文本。Awk 脚本使用模式-动作语法,Awk 对文件中与模式匹配的每一行执行一个动作。 这提供了一种灵活而强大的脚本语言来处理文本。 例如,单行 Awk 脚本 /error/ {print $1, $2, $3}
将打印包含单词 error
的任何行的前三个空格分隔的字段。
虽然我们也有 GNU 版本的 Awk,称为 Gawk,但原始 Awk 仍在开发中。 最近,Brian Kernighan 启动了一个项目,为 Awk 添加 Unicode 支持。 我采访了 Brian,询问 Awk 的起源以及他最近在 Awk 上的开发工作。
Jim Hall:Awk 是一款用于解析和处理文本的优秀工具。 它是如何开始的?
Brian Kernighan: 最直接的影响是 Marc Rochkind 在贝尔实验室从事程序员工作台系统时开发的一个工具。 现在我记得,Marc 的程序接受正则表达式列表并创建一个 C 程序来读取输入文件。 每当程序找到与其中一个正则表达式匹配的内容时,它就会打印匹配的行。 它旨在创建错误检查以在来自电话运营数据的日志文件上运行。 这是一个非常棒的主意——Awk 只是一个概括。
Jim:AWK 代表创建它的三个人:Al Aho、Peter Weinberger 和 Brian Kernighan。 你们三人是如何设计和创建 Awk 的?
Brian: Al 对正则表达式很感兴趣,并且最近实现了 egrep,它为比 grep 提供的更大的正则表达式类提供了一种非常有效的延迟评估技术。 这给了我们一个语法和工作代码。
Peter 对数据库很感兴趣,作为其中的一部分,他对报告生成(如 IBM 提供的 RPG 语言)感兴趣。 我一直在尝试找出某种编辑系统,该系统可以或多或少地轻松处理字符串和数字。
我们探索了设计,但时间不长。 我认为 Al 可能提供了基本的模式-动作范例,但这在各种现有工具中是隐含的,例如 grep、流编辑器 sed 以及我们用于实现的语言工具 YACC 和 Lex。 自然,动作语言必须像 C 一样。
Jim:Awk 最初是如何在贝尔实验室使用的? Awk 何时首次被采用到 Unix 中?
Brian: Awk 创建于 1977 年,因此它是第 7 版 Unix 的一部分,我认为它大约出现在 1979 年。 我不会说它被采用,而是说它只是因为在那里而被包含的另一个程序。 人们很快就掌握了它,我们很快就在实验室里拥有了用户。 人们编写的程序比我们预期的要大得多,甚至有数万行,这真是太神奇了。 但对于某些类型的应用程序来说,该语言是一个很好的匹配。
Jim:Awk 这些年来是否发生过变化,还是今天的 Awk 与 1977 年的 Awk 大致相同?
Brian: 总的来说,它一直非常稳定,但也有相当多的小事情,主要是为了跟上至少 Gawk 的核心部分。 示例包括诸如执行大小写转换的函数、某些类型的正则表达式的简写或诸如 /dev/stderr
之类的特殊文件名。 在内部,已经做了很多工作来用增长的数组替换固定大小的数组。 维护 Gawk 的 Arnold Robbins 也对 Awk 提供了极大的帮助,提供了良好的建议、测试、代码和 Git 方面的帮助。
Jim:您目前正在为 Awk 添加 Unicode 支持。 这是其中一个项目,当您听到它时,它似乎很明显,因为 Unicode 无处不在,但并非每个程序都支持它。 请告诉我们您为 Awk 添加 Unicode 的项目。
Brian: 一段时间以来,Awk 只处理 8 位输入有点令人尴尬,尽管公平地说,它比 Unicode 早了 10 或 20 年。 GNU 版本 Gawk 已经正确处理 Unicode 相当长一段时间了,因此保持最新和兼容性是一件好事。
Jim:添加 Unicode 支持的项目有多大? 这是否需要对源代码进行许多更改?
Brian: 我没有统计过,但可能大约有 200 或 300 行,主要集中在正则表达式识别器或必须以字符而不是字节运行的各种内置函数中,用于 Unicode 输入。
Jim:您在为 Awk 添加 Unicode 方面进展如何?
Brian: GitHub 上有一个代码分支非常最新。 它已经过测试,但总有更多测试的空间。
需要提到的一件事:它处理 UTF-8 输入和输出,但对于 Unicode 代码点,这与 Unicode 字素不同。 这种区别很重要,但在技术上非常复杂,至少就我理解而言。 举个简单的例子,带有重音的字母可以表示为两个代码点(字母和重音)或单个字符(字素)。 正确地做到这一点,无论这意味着什么,都非常困难。
Jim:在一个 Computerphile 视频 中,您提到为 Awk 添加了对逗号分隔值 (CSV) 解析的支持。 该项目进展如何?
Brian: 当我再次接触代码时,我确实添加了对 CSV 输入的支持,因为那是该语言中一直很笨拙的另一部分。 我没有为 CSV 输出做任何事情,因为使用几个简短的函数很容易做到,但也许应该重新审视一下。
Jim:您在日常工作中使用 Awk 做哪些事情?
Brian: 一切。 几乎所有处理文本的东西都是 Awk 的目标。 当然,我最常用的 Awk 程序是一个简单的程序,用于使文本文档中的所有行都具有相同的长度。 在回答您的问题时,我可能使用了它 100 次。
Jim:您使用 Awk 做过的最酷(或最不寻常)的事情是什么?
Brian: 很久以前,我编写了一个 C++ 程序,通过执行诸如重载关联数组的括号之类的操作,将 Awk 程序转换为看起来尽可能接近 Awk 的 C++。 它从未被使用过,但它是一项有趣的练习。
进一步阅读
- Awk 速查表
- 学习 Awk 的实用指南(电子书)
评论已关闭。