文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>[转3]GAWK 入门:AWK 语言基础

[转3]GAWK 入门:AWK 语言基础

时间:2008-08-03  来源:sobigapple

利用 GAWK 的开放源代码实现学习 AWK

第 5 页,共 10 页


对本教程的评价

帮助我们改进这些内容


操作记录和字段

当 GAWK 读入一个记录时,它会将该记录中所有的字段存储到变量中。您可以通过使用 $ 加上字段编号来引用每个字段,所以 $1 引用第 1 个字段,$2 引用第 2 个字段,依此类推,直到记录中的最后一个字段。

图 4 以缺省的记录和字段显示了示例文本。


图 4. 将示例文件分解为 AWK 记录和字段

如输入文件的组成部分中所述,您可以使用 $0 来引用整个记录,其中包括所有的字段和字段分隔符。这是许多命令的缺省值。所以例如,正如前面使用过的 print,它等价于 print $0,这两个命令都将打印出当前整个记录。

打印特定的字段

要输出某个特定的字段,可以将该字段的名称作为参数提供给 print。下面的命令尝试打印示例文件中每个记录的第 1 个字段:

$ awk ' { print $1 } ' sample Heigh-ho! Most Then, $ 

您可以在 print 语句中提供多个字段,并且它们可以使用任意的顺序:

$ awk ' { print $7, $3, $1 } ' sample holly: heigh-ho! Heigh-ho! mere is Most the Then, $ 

请注意,有些行中没有第 7 个字段,在这种情况下,将不打印任何内容。

当使用逗号进行分隔时,这些字段在输出时将使用空格隔开。您可以省略逗号,以便将它们连接起来。要打印第 7 个和第 8 个字段,并将它们连接起来,可以使用下面的命令:

$ awk ' { print $7 $8 } ' sample holly: merefolly: $ 

您可以将使用引号括起来的文本和字段组合在一起。尝试下面的命令:

$ awk ' { print "Field 2: " $2 } ' sample Field 2: sing, Field 2: friendship Field 2: heigh-ho, $ 

您已经了解了处理字段和记录的强大功能,使用 AWK,很容易对表型数据进行解析、操作,并使用一些简单的命令重新进行格式化。您可以使用 Shell 重定向机制将经过重新格式化的输出定向到一个新的文件,或使用管道进行传输。

如果作为筛选器使用,那么可以将这种功能与其他的命令联合使用,这是非常有价值的。例如,下面的命令修改了日期的缺省输出,以便以日 月,年 的格式进行输出:

$ date|awk '{print $3 " " $2 ", " $6}' 29 Nov, 2006 $ 





回页首


更改字段分隔符

到目前为止,示例中的字段都使用空格字符进行分隔。这是缺省的行为,即任意个数的空格或制表符,您可以对其进行更改。字段分隔符的值保存在 FS 变量中。与 AWK 中的其他变量一样,可以在程序中的任何位置对其进行重新定义。要对整个文件使用不同的字段分隔符,可以在 BEGIN 语句重新定义它。

使用感叹号 (!) 作为字段分隔符打印示例数据的第 1 个字段:

$ awk ' BEGIN { FS = "!" } { print $1 } ' sample Heigh-ho Most friendship is feigning, most loving mere folly: Then, heigh-ho, the holly $ 

请注意在打印第 2 个和第 3 个字段时的差别:

$ awk ' BEGIN { FS = "!" } { print $2 } ' sample sing, heigh-ho $ awk ' BEGIN { FS = "!" } { print $3 } ' sample unto the green holly: $ 

尝试将输出中的字段与图 4 中列出的字段进行比较。

但是字段分隔符并不一定必须是单个字符。可以使用一个短语:

$ awk ' BEGIN { FS = "Heigh-ho" } { print $2 } ' sample ! sing, heigh-ho! unto the green holly: $ 

在 GAWK 中,字段分隔符可以是任何正则表达式。要使每个输入字符成为一个独立的字段,可以让 FS 的值为空。

算出大写字母的总数。上面的示例仅在整个文件中匹配一个分隔符,而下面的示例将匹配短语,无论大小写:

$ awk ' BEGIN { FS = "[Hh]eigh-ho" } { print $2 } ' sample ! sing, , the holly! $ 

通过在命令行中使用引号将其括起来并作为 -F 选项的参数,也可以更改字段分隔符:

$ awk -F "," ' { print $2 } ' sample heigh-ho! unto the green holly: most loving mere folly: heigh-ho $ 

使用这种功能,很容易创建可以对文件进行解析的单行程序,如 /etc/passwd,其中的字段由冒号 (:) 进行分隔。您可以轻松地从中提取完整的用户名称列表,例如:

$ awk -F ":" ' { print $5 } ' /etc/passwd 





回页首


更改记录分隔符

与字段分隔符一样,您可以将记录分隔符的缺省值(换行符)更改为所需的任何内容。其当前值保存在 RS 变量中。

将记录分隔符更改为逗号,并对示例文件使用它:

$ awk ' BEGIN { RS = "," } //' sample Heigh-ho! sing heigh-ho! unto the green holly: Most friendship is feigning most loving mere folly: Then heigh-ho the holly! $ 





回页首


更改输出

对 AWK 输出的处理与 AWK 输入数据一样,它被分解为许多字段和记录,输出流具有自己的分隔符,初始情况下与输入分隔符的缺省值相同,即空格和换行。print 语句中的字段由逗号分隔,该语句中使用的输出字段分隔符 设置为单个空格,您可以重新定义 OFS 变量,以对其进行更改。输出记录分隔符 设置为换行符,您可以通过重新定义 ORS 变量对其进行更改。

要从文件中删除所有的换行,并将文件中所有的文本置于一行,只需将输出记录分隔符更改为空字符即可,对于某些文本分析和筛选来说,这样做是非常有价值的。

使用示例文件尝试下面的命令:

$ awk 'BEGIN {ORS=""} //' sample Heigh-ho! sing, heigh-ho! unto the green holly:Most friendship\ is feigning, most loving mere folly:Then, heigh-ho, the holly!$ 

删除了所有的换行,包括最后一个。返回的 Shell 提示符与输出数据出现在同一行中。要在结尾添加一个换行,可以将其放在 END 规则中:

$ awk 'BEGIN {ORS=""} // { print } END {print "\n"}' sample Heigh-ho! sing, heigh-ho! unto the green holly:Most friendship\ is feigning, most loving mere folly:Then, heigh-ho, the holly! $ 





回页首


更多 GAWK 变量

NF 变量包含当前记录中字段的个数。使用 NF 可以引用其数值,而使用 $NF 则表示引用实际字段本身的内容。所以,如果记录有 100 个字段,print NF 将输出整数 100,而 print $100 则与 print $NF 输出相同的结果,都是该记录中最后一个字段的内容。

NR 变量包含当前的记录个数。当读取到第 1 个记录时,其值为 1,当读取到第 2 个记录时,其值增为 2,依此类推。在 END 模式中使用它,以便输出输入中的行数:

$ awk 'END { print "Input contains " NR " lines." }' sample Input contains 3 lines. $ 

注意:如果上面的 print 语句位于 BEGIN 模式中,那么该程序将报告其输入包含 0 行内容,因为在执行时 NR 的值为 0,因为此时尚未读入任何输入记录。

使用 $NR 打印相对于当前记录个数的字段:

$ awk '{ print NR, $NR }' sample 1 Heigh-ho! 2 friendship 3 the $ 

再来研究一下图 4,可以看到第 1 个记录中的字段 1 的值、第 2 个记录中的字段 2 的值,以及最后一个记录中字段 3 的值。将其与您的程序输出进行比较。

尝试列出每个记录中字段的个数,以及最后一个字段的值:

$ awk ' { print "Record " NR " has " NF " fields and ends with " $NF}' sample Record 1 has 7 fields and ends with holly: Record 2 has 8 fields and ends with folly: Record 3 has 4 fields and ends with holly! 

通常可以使用大量特殊的 GAWK 变量。表 2 列出了这些变量,并对其含义进行了描述。


表 2. 常见的 GAWK 变量
变量 描述
NF 该变量包含每个记录的字段个数。
NR 该变量包含当前的记录个数。
FS 该变量是字段分隔符。
RS 该变量是记录分隔符。
OFS 该变量是输出字段分隔符。
ORS 该变量是输出记录分隔符。
FILENAME 该变量包含所读取的输入文件的名称。
IGNORECASE 当 IGNORECASE 设置为非空值,GAWK 将忽略模式匹配中的大小写。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载