daniel robbins 【程序编程相关:学习嵌入式Linux的笔记和体会】
【推荐阅读:系统调用的实现及调用过程】总裁兼 ceo, gentoo technologies, inc. 【扩展信息:iptables 中文手册】 2001 年 1 月 在这篇 awk简介的续集中,daniel robbins 继续探索awk(一种很棒但有怪异名称的语言).daniel将演示如何处理多行记录.使用循环结构,以及创建并使用 awk数组.阅读完本文后,您将精通许多 awk的功能,而且可以编写您自己的功能强大的 awk 脚本.多行记录
awk 是一种用于读取与处理结构化数据(如系统的 /etc/passwd 文件)的极佳工具./etc/passwd 是 unix 用户数据库,并且是用冒号定界的文本文件,它包含许多重要信息,包括所有现有用户帐户与用户标识,以及其它信息.在我的 前一篇文章 中,我演示了 awk 如何轻松地分析这个文件.我们只须将 fs(字段分隔符)变量设置成 ":".正确设置了 fs 变量之后,就可以将 awk 配置成分析几乎任何类型的结构化数据,只要这些数据是每行一个记录.然而,如果要分析占据多行的记录,仅仅依靠设置 fs 是不够的.在这些情况下,我们还需要修改 rs 记录分隔符变量.rs 变量告诉 awk 当前记录什么时候结束,新记录什么时候开始.
譬如,让我们讨论一下如何完成处理“联邦证人保护计划”所涉及人员的地址列表的任务:
jimmy the weasel 100 pleasant drive san francisco, ca 12345 big tony 200 incognito ave. suburbia, wa 67890理论上,我们希望 awk 将每 3 行看作是一个独立的记录,而不是三个独立的记录.如果 awk 将地址的第一行看作是第一个字段 (),街道地址看作是第二个字段 (),城市.州与邮政编码看作是第三个字段 ,那么这个代码就会变得很简单.以下就是我们想要得到的代码:
begin { fs="\n" rs="" }在上面这段代码中,将 fs 设置成 "\n" 告诉 awk 每个字段都占据一行.通过将 rs 设置成 "",还会告诉 awk 每个地址记录都由空白行分隔.一旦 awk 知道是如何格式化输入的,它就可以为我们执行所有分析工作,脚本的其余部分很简单.让我们研究一个完整的脚本,它将分析这个地址列表,并将每个记录打印在一行上,用逗号分隔每个字段.
address.awk begin { fs="\n" rs="" } { print ", " ", " }如果这个脚本保存为 address.awk,地址数据存储在文件 address.txt 中,可以通过输入 "awk -f address.awk address.txt" 来执行这个脚本.此代码将产生以下输出:
jimmy the weasel, 100 pleasant drive, san francisco, ca 12345 big tony, 200 incognito ave., suburbia, wa 67890ofs 与 ors
在 address.awk 的 print 语句中,可以看到 awk 会连接(合并)一行中彼此相邻的字符串.... 下一页