如果字段由空格分隔(一个或多个空格或 tab),您可能想要将 FS 设置成以下规则表达式:
FS="[[:space:] ]"
这个赋值表达式也有问题,它并非必要 。为什么?因为缺省情况下,FS 设置成单一空格字符,awk 将这解释成表示“一个或多个空格或 tab” 。在这个特殊示例中,缺省 FS 设置恰恰是您最想要的!
复杂的规则表达式也不成问题 。即使您的记录由单词 "foo" 分隔,后面跟着三个数字,以下规则表达式仍允许对数据进行正确的分析:
FS="foo[0-9][0-9][0-9]"
字段数量
接着我们要讨论的两个变量通常并不是需要赋值的,而是用来读取以获取关于输入的有用信息 。第一个是 NF 变量,也叫做“字段数量”变量 。awk 会自动将该变量设置成当前记录中的字段数量 。可以使用 NF 变量来只显示某些输入行:
NF == 3 { print "this particular record has three fields: " $0 }
当然,也可以在条件语句中使用 NF 变量,如下:
{ if ( NF > 2 ) { print $1 " " $2 ":" $3 }}
记录号
记录号 (NR) 是另一个方便的变量 。它始终包含当前记录的编号(awk 将第一个记录算作记录号 1) 。迄今为止,我们已经处理了每一行包含一个记录的输入文件 。对于这些情况,NR 还会告诉您当前行号 。然而,当我们在本系列以后部分中开始处理多行记录时,就不会再有这种情况,所以要注意!可以象使用 NF 变量一样使用 NR 来只打印某些输入行:
(NR < 10 ) || (NR > 100) { print "We are on record number 1-9 or 101 " }
另一个示例:
{ #skip header if ( NR > 10 ) { print "ok, now for the real information!" }}
awk 提供了适合各种用途的附加变量 。我们将在以后的文章中讨论这些变量 。
现在已经到了初次探索 awk 的尾声 。随着本系列的开展,我将演示更高级的 awk 功能,我们将用一个真实的 awk 应用程序作为本系列的结尾 。同时,如果急于学习更多知识,请参考以下列出的参考资料 。
第二部分
在这篇 awk 简介的续集中,Daniel Robbins 继续探索 awk(一种很棒但有怪异名称的语言) 。Daniel 将演示如何处理多行记录、使用循环结构,以及创建并使用 awk 数组 。阅读完本文后,您将精通许多 awk 的功能,而且可以编写您自己的功能强大的 awk 脚本 。
多行记录
awk 是一种用于读取和处理结构化数据(如系统的 /etc/passwd 文件)的极佳工具 。/etc/passwd 是 UNIX 用户数据库,并且是用冒号定界的文本文件,它包含许多重要信息,包括所有现有用户帐户和用户标识,以及其它信息 。在我的前一篇文章中,我演示了 awk 如何轻松地分析这个文件 。我们只须将 FS(字段分隔符)变量设置成 ":" 。
正确设置了 FS 变量之后,就可以将 awk 配置成分析几乎任何类型的结构化数据,只要这些数据是每行一个记录 。然而,如果要分析占据多行的记录,仅仅依靠设置 FS 是不够的 。在这些情况下,我们还需要修改 RS 记录分隔符变量 。RS 变量告诉 awk 当前记录什么时候结束,新记录什么时候开始 。
譬如,让我们讨论一下如何完成处理“联邦证人保护计划”所涉及人员的地址列表的任务:
Jimmy the Weasel100 Pleasant DriveSan Francisco, CA 12345Big Tony200 Incognito Ave.Suburbia, WA 67890
理论上,我们希望 awk 将每 3 行看作是一个独立的记录,而不是三个独立的记录 。如果 awk 将地址的第一行看作是第一个字段 ($1),街道地址看作是第二个字段 ($2),城市、州和邮政编码看作是第三个字段 $3,那么这个代码就会变得很简单 。以下就是我们想要得到的代码:
BEGIN { FS="n" RS=""}
在上面这段代码中,将 FS 设置成 "n" 告诉 awk 每个字段都占据一行 。通过将 RS 设置成 "",还会告诉 awk 每个地址记录都由空白行分隔 。一旦 awk 知道是如何格式化输入的,它就可以为我们执行所有分析工作,脚本的其余部分很简单 。让我们研究一个完整的脚本,它将分析这个地址列表,并将每个记录打印在一行上,用逗号分隔每个字段 。
推荐阅读
- 通用线程--sed 实例,第3部分
- 通用线程--sed 实例,第1部分
- 通用线程--sed 实例,第2部分
- FreeBSD下设置modem和modem的通用命令
- 什么叫多线程
- 和彩云支持普通用户上传多大文件
- 缝好衣服后怎么用短线快速打结?男女通用
- 医保是全国通用的吗
- 5e和steam皮肤通用吗
- 下 Solaris 10通用桌面CDE快速入门