43、gawk:发展、安装与使用指南

gawk:发展、安装与使用指南

1. gawk的正则范围解释与发展历程

在gawk的发展过程中,正则表达式范围解释曾是一个令人困扰的问题。早期,gawk使用的正则匹配代码不支持本地化,范围具有传统的解释方式。然而,当gawk转向使用支持本地化的正则匹配器时,问题便接踵而至。特别是随着GNU/Linux和商用Unix供应商开始实现非ASCII本地化设置并将其设为默认,用户经常会问“为什么‘[A - Z]’会匹配小写字母?”这样的问题。

这种情况持续了将近10年之久,gawk维护者疲于向用户解释gawk是符合标准的,问题出在用户的本地化设置上。在gawk 4.0版本开发期间,维护者对其进行了修改,除非使用 --posix 选项,否则gawk总是以POSIX标准之前的方式处理范围。

幸运的是,在gawk 4.0最终发布前不久,维护者了解到2008年的标准已经改变了范围的定义,即在“C”和“POSIX”本地化设置之外,范围表达式的含义未被定义。这使得实现者可以自由选择如何实现范围解释。gawk维护者选择在默认的正则匹配以及使用 --traditional --posix 选项时,都应用POSIX标准之前的含义,并且在所有情况下gawk都保持与POSIX标准兼容。

由此,“合理范围解释(Rational Range Interpretation,简称RRI)”运动诞生,许多GNU工具已经或即将实现这一改变。

2. gawk的主要贡献者

gawk的发展离不开众多开发者的贡献,以下是按大致时间顺序列出的主要贡献者:
| 贡献者 | 主要贡献 |
| ---- | ---- |
| Dr. Alfred V. Aho、Dr. Peter J. Weinberger、Dr. Brian W. Kernighan | 设计并实现Unix awk,gawk的大部分功能集都源于此 |
| Paul Rubin | 1986年进行初始设计和实现,并撰写了约40页的初稿 |
| Jay Fenlason | 完成初始实现 |
| Diane Close | 修订初稿,使其达到约90页 |
| Richard Stallman | 帮助完成实现和初稿,也是FSF和GNU项目的创始人 |
| John Woods | 在gawk初始版本中贡献部分代码(主要是修复) |
| David Trueman | 1988年接管gawk的主要维护工作,使其与“新”awk兼容并大幅提高性能 |
| Conrad Kwok、Scott Garfinkle、Kent Williams | 完成对MS - DOS的初始移植,使用不同版本的MSC |
| Pat Rankin | 提供VMS端口及其文档 |
| Hal Peterson | 帮助将gawk移植到Cray系统(现已不再支持) |
| Kai Uwe Rommel | 提供对OS/2的初始端口及其文档 |
| Michal Jaegermann | 提供对Atari系统的端口及其文档(现已不再支持),继续提供可移植性检查,并做了大量工作确保gawk在非32位系统上运行 |
| Fred Fish | 提供对Amiga系统的端口及其文档(因Fred去世,现已不再支持) |
| Scott Deifik | 使用DJGPP维护MS - DOS端口 |
| Eli Zaretskii | 使用MinGW维护MS - Windows端口 |
| Juan Grigera | 提供对Windows32系统的端口(现已不再支持) |
| Dr. Darrel Hankerson | 多年来协调不同PC平台的移植工作,为各种PC操作系统创建二进制发行版,还负责保持各PC平台文档的更新 |
| Christos Zoulas | 提供用于动态添加新函数的 extension() 内置函数(在gawk 4.1中已被弃用) |
| Jürgen Kahrs | 贡献TCP/IP网络代码和文档的初始版本,并促使 |& 运算符的加入 |
| Stephen Davies | 提供对Tandem系统的初始端口及其文档(现已不再支持),并在将字节码内部结构集成到gawk代码库的初始工作中发挥重要作用 |
| Matthew Woehlke | 为Tandem的POSIX兼容系统提供改进 |
| Martin Brown | 提供对BeOS的端口及其文档(现已不再支持) |
| Arno Peters | 进行将gawk转换为使用GNU Automake和GNU gettext的初始工作 |
| Alan J. Broder | 提供 asort() 函数的初始版本以及 match() 函数可选第三个参数的代码 |
| Andreas Buening | 更新gawk的OS/2端口 |
| Isamu Hasegawa | 贡献对多字节字符的支持 |
| Michael Benzinger | 贡献 switch 语句的初始代码 |
| Patrick T.J. McPhee | 贡献Windows32环境下动态加载的代码(现已不再支持) |
| Anders Wallin | 多年来帮助维持VMS端口的运行 |
| Assaf Gordon | 贡献实现 --sandbox 选项的代码 |
| John Haque | 进行多项改进,包括将gawk转换为字节码解释器(包括调试器)、添加真正的数组嵌套、支持任意精度算术、撰写第15章的初始文本、将三个版本的gawk合并为一个(用于4.1版本发布)、改进整数索引数组的内部结构以及与Pat Rankin共同推动数组排序功能的改进 |
| Panos Papadopoulos | 贡献“将其他文件包含到你的程序中”部分的原始文本 |
| Efraim Yawitz | 贡献第14章的原始文本 |
| Arnold Robbins、Andrew Schorr及开发团队其他成员 | 推动gawk 4.1首次发布的扩展API的开发 |
| John Malmberg | 对OpenVMS端口及相关文档进行重大改进 |
| Antonio Giovanni Colombo | 重写早期章节中一些过时的示例 |
| Arnold Robbins | 自1988年开始参与gawk开发,起初帮助David Trueman,自1994年左右成为主要维护者 |

3. gawk的获取与安装
3.1 获取gawk发行版

有两种方式可以获取GNU软件:
- 从已经拥有该软件的人那里复制。
- 从互联网主机 ftp.gnu.org /gnu/gawk 目录中检索gawk。支持匿名ftp和http访问。如果你有 wget 程序,可以使用以下命令:

wget http://ftp.gnu.org/gnu/gawk/gawk-4.1.2.tar.gz

GNU软件存档在全球有镜像站点,最新的镜像站点列表可从FSF主网站获取。建议使用镜像站点,它们通常不那么繁忙,并且你通常可以找到离你更近的站点。

3.2 提取发行版

gawk以使用不同压缩程序(gzip、bzip2和xz)压缩的多个tar文件形式分发。为简单起见,以下说明假设你使用的是用GNU Gzip程序(gzip)压缩的文件。

一旦你获得了发行版(例如 gawk-4.1.2.tar.gz ),可以使用gzip解压缩文件,然后使用tar提取文件。可以使用以下管道命令来生成gawk发行版:

gzip -d -c gawk-4.1.2.tar.gz | tar -xvpf -

在使用GNU tar的系统上,你可以让tar为你完成解压缩:

tar -xvpzf gawk-4.1.2.tar.gz

提取存档会在当前目录中创建一个名为 gawk-4.1.2 的目录。发行版文件名的格式为 gawk-V.R.P.tar.gz ,其中V表示gawk的主要版本,R表示版本V的当前发行版,P表示补丁级别,意味着在该发行版中修复了一些小错误。当前补丁级别为2,但在检索发行版时,你应该获取版本号、发行版号和补丁级别最高的版本。需要注意的是,补丁级别大于或等于70表示“测试版”或非生产软件,除非你愿意进行实验,否则可能不想检索此类版本。如果你不在Unix或GNU/Linux系统上,需要另行安排获取和提取gawk发行版的方法,建议咨询当地专家。

3.3 gawk发行版的内容

gawk发行版包含许多C源文件、文档文件、子目录以及与配置过程相关的文件,还有与不同非Unix操作系统相关的几个子目录:
- 各种 .c .y .h 文件 :包含实际的gawk源代码。
- ABOUT - NLS :包含有关GNU gettext和翻译的信息。
- AUTHORS :包含有关gawk作者的一些信息,仅为满足自由软件基金会的要求而存在。
- README、README_d/README. :描述性文件, README 适用于Unix下的gawk,其余适用于各种硬件和软件组合。
-
INSTALL :提供配置和安装过程的概述。
-
ChangeLog、ChangeLog.0 :分别为详细和较旧的源代码更改列表。
-
NEWS、NEWS.0 :分别为自上次发布或补丁以来gawk的更改列表和较旧的更改列表。
-
COPYING :GNU通用公共许可证。
-
POSIX.STD :描述awk的POSIX标准中未定义的行为,或gawk可能不完全符合的地方,以及POSIX标准应该描述但未描述的内容。
-
doc/目录下的文件 :包含各种文档相关的文件,如手册页、Texinfo源文件等。
-
Makefile.am、Makefile.in等文件 :用于GNU Automake和Autoconf生成配置文件。
-
po/目录 :包含消息翻译。
-
awklib/目录 :包含 extract.awk ,可用于从本书的Texinfo源文件中提取示例程序,还包含库函数和 igawk 程序。
-
extension/目录 :包含gawk附带的示例扩展的源代码、手册页和基础设施文件。
-
posix/目录 :构建gawk在POSIX兼容系统上所需的文件。
-
pc/目录 :在MS - Windows下构建gawk所需的文件。
-
vms/目录 :在Vax/VMS和OpenVMS下构建gawk所需的文件。
-
test/目录 *:gawk的测试套件,你可以在gawk顶级目录中使用 make check 命令来运行测试。

4. 在类Unix系统上编译和安装gawk

通常,你只需输入两个命令就可以编译和安装gawk。但如果你使用的是不常见的系统,可能需要自己为系统配置gawk。

4.1 编译gawk

正常的安装步骤适用于所有现代商业Unix派生系统、GNU/Linux、基于BSD的系统以及用于MS - Windows的Cygwin环境。

在提取gawk发行版后,进入 gawk - 4.1.2 目录。与大多数GNU软件一样,你可以通过运行 configure 程序为系统配置gawk。这个程序是一个Bourne shell脚本,使用GNU Autoconf自动生成。

要配置gawk,只需运行:

sh ./configure

这将生成一个针对你的系统定制的 Makefile config.h 文件。 config.h 文件描述了你的系统的各种信息。你可能想编辑 Makefile 来更改 CFLAGS 变量,该变量控制传递给C编译器的命令行选项(如优化级别或调试编译)。

或者,你可以在运行 configure 时在命令行上添加自己的大多数 make 变量的值,例如 CC CFLAGS

CC=cc CFLAGS=-g sh ./configure

有关详细信息,请参阅gawk发行版中的 INSTALL 文件。

在运行 configure 并可能编辑 Makefile 后,输入:

make

不久之后,你应该会得到一个可执行版本的gawk。为了验证gawk是否正常工作,运行 make check ,所有测试都应该通过。如果这些步骤不起作用,或者任何测试失败,请检查 README_d 目录中的文件,看是否遇到了已知问题。如果失败情况未在其中描述,请提交错误报告。

4.2 安装gawk

当然,一旦你构建了gawk,可能希望安装它。为此,你需要以具有适当权限的用户身份运行 make install 命令。具体操作因系统而异,但在许多系统上,你可以使用 sudo 命令,命令变为:

sudo make install

你可能会被要求输入密码,并且你必须事先被设置为允许运行 sudo 命令的用户。

4.3 额外的配置选项

在从头编译gawk时,你可以在 configure 命令行上使用以下额外选项:
- --disable-extensions :禁用配置和构建 extension 目录中的示例扩展,这对于交叉编译很有用。默认操作是动态检查扩展是否可以配置和编译。
- --disable-lint :禁用gawk内的所有lint检查。 --lint --lint - old 选项(见“命令行选项”)会被接受,但不会执行任何操作。同样,设置 LINT 变量(见“控制awk的内置变量”)对运行中的awk程序没有影响。与GNU编译器集合(GCC)的自动死代码消除一起使用时,此选项可在GNU/Linux x86_64系统上使gawk可执行文件的大小减少近23K字节。其他系统和编译器的结果可能会有所不同。使用此选项可能会带来一些轻微的性能提升,但会导致测试套件中的一些测试失败,此选项可能会在以后的版本中移除。
- --disable-nls :禁用所有消息翻译功能,通常不太可取,但可能会带来一些轻微的性能提升。
- --with-whiny-user-strftime :强制在有缺陷的系统上使用包含的C strftime() 函数版本。

你可以使用 ./configure --help 命令查看 configure 提供的完整选项列表。

以下是在类Unix系统上编译和安装gawk的流程图:

graph TD;
    A[获取gawk发行版] --> B[提取发行版];
    B --> C[进入gawk-4.1.2目录];
    C --> D[运行configure程序];
    D --> E{是否需要编辑Makefile?};
    E -- 是 --> F[编辑Makefile];
    E -- 否 --> G[运行make命令];
    F --> G;
    G --> H[运行make check验证];
    H --> I{测试是否通过?};
    I -- 是 --> J[运行make install安装];
    I -- 否 --> K[检查README_d目录或提交错误报告];

通过以上步骤,你可以顺利获取、编译和安装gawk,并了解其发展历程和主要贡献者。在使用过程中,合理利用其功能和配置选项,将能更好地发挥gawk的作用。

gawk:发展、安装与使用指南

5. gawk的特性与优势总结

gawk作为一款功能强大的工具,在文本处理和数据处理领域有着广泛的应用。它具有以下显著特性和优势:
- 丰富的功能集 :继承自Unix awk的大部分功能,并在此基础上进行了大量扩展。例如,支持用户自定义函数、数组操作、正则表达式匹配等,能够满足各种复杂的数据处理需求。
- 良好的兼容性 :既与POSIX标准兼容,又提供了 --traditional --posix 选项来禁用扩展功能,以适应不同的使用场景和需求。
- 本地化支持 :虽然在本地化设置与正则表达式匹配的交互上曾存在问题,但通过“合理范围解释(RRI)”的实现,解决了大部分困扰用户的问题,确保在不同的本地化环境下都能正常工作。
- 可扩展性 :提供了扩展API,允许开发者动态添加新的函数和功能,进一步增强了gawk的灵活性和适用性。
- 多平台支持 :可以在多种操作系统上运行,包括Unix、GNU/Linux、MS - Windows等,并且有众多开发者为不同平台的移植和维护做出了贡献。

6. gawk使用场景示例

为了更好地理解gawk的实际应用,以下列举几个常见的使用场景:
| 使用场景 | 描述 | 示例代码 |
| ---- | ---- | ---- |
| 数据提取 | 从文本文件中提取特定信息 | gawk '/pattern/ {print $2}' file.txt :提取包含 pattern 的行的第二个字段 |
| 数据统计 | 对数据进行统计分析 | gawk '{sum += $1} END {print sum}' file.txt :计算文件中第一列数据的总和 |
| 文本替换 | 替换文本中的特定内容 | gawk '{gsub(/old/, "new"); print}' file.txt :将文件中所有的 old 替换为 new 并输出 |
| 条件筛选 | 根据条件筛选数据 | gawk '$3 > 10 {print}' file.txt :输出第三列数据大于10的行 |

7. 常见问题及解决方法

在使用gawk的过程中,可能会遇到一些常见问题,以下是一些问题及对应的解决方法:
- 正则表达式匹配异常 :如 [A - Z] 匹配小写字母的问题,可通过使用 --traditional --posix 选项来确保范围解释符合预期。
- 编译安装失败 :如果在编译或安装过程中遇到问题,首先检查 README_d 目录中的文件,看是否有已知问题的解决方案。若问题仍未解决,可提交错误报告。
- 性能问题 :如果gawk运行速度较慢,可以尝试使用 --disable-lint --disable-nls 选项来减少不必要的检查和功能,可能会带来一定的性能提升。

8. 总结与展望

gawk经过多年的发展,已经成为一款成熟且功能强大的文本处理工具。众多开发者的贡献使得gawk不断完善,具备了丰富的功能和良好的兼容性。通过合理使用gawk的各种特性和配置选项,用户可以高效地完成各种数据处理任务。

未来,随着技术的不断发展,gawk可能会在以下方面继续改进和拓展:
- 性能优化 :进一步优化代码,提高处理大规模数据时的性能。
- 新功能添加 :根据用户需求,添加更多实用的功能和扩展。
- 更好的本地化支持 :确保在各种本地化环境下都能提供一致的用户体验。

以下是一个使用gawk进行数据处理的简单流程示例:

graph TD;
    A[准备数据文件] --> B[编写gawk脚本];
    B --> C[执行gawk命令处理数据];
    C --> D{处理结果是否符合预期?};
    D -- 是 --> E[输出结果];
    D -- 否 --> F[修改gawk脚本];
    F --> C;

通过以上内容,我们对gawk的发展历程、安装方法、特性优势、使用场景以及常见问题解决方法有了全面的了解。希望这些信息能帮助你更好地使用gawk,发挥其在数据处理中的强大作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值