[转3]GAWK 入门:AWK 语言基础
时间:2008-08-03 来源:sobigapple
利用 GAWK 的开放源代码实现学习 AWK |
操作记录和字段 当 GAWK 读入一个记录时,它会将该记录中所有的字段存储到变量中。您可以通过使用 $ 加上字段编号来引用每个字段,所以 $1 引用第 1 个字段,$2 引用第 2 个字段,依此类推,直到记录中的最后一个字段。 图 4 以缺省的记录和字段显示了示例文本。 图 4. 将示例文件分解为 AWK 记录和字段 如输入文件的组成部分中所述,您可以使用 $0 来引用整个记录,其中包括所有的字段和字段分隔符。这是许多命令的缺省值。所以例如,正如前面使用过的 print,它等价于 print $0,这两个命令都将打印出当前整个记录。 要输出某个特定的字段,可以将该字段的名称作为参数提供给 print。下面的命令尝试打印示例文件中每个记录的第 1 个字段:
您可以在 print 语句中提供多个字段,并且它们可以使用任意的顺序:
请注意,有些行中没有第 7 个字段,在这种情况下,将不打印任何内容。 当使用逗号进行分隔时,这些字段在输出时将使用空格隔开。您可以省略逗号,以便将它们连接起来。要打印第 7 个和第 8 个字段,并将它们连接起来,可以使用下面的命令:
您可以将使用引号括起来的文本和字段组合在一起。尝试下面的命令:
您已经了解了处理字段和记录的强大功能,使用 AWK,很容易对表型数据进行解析、操作,并使用一些简单的命令重新进行格式化。您可以使用 Shell 重定向机制将经过重新格式化的输出定向到一个新的文件,或使用管道进行传输。 如果作为筛选器使用,那么可以将这种功能与其他的命令联合使用,这是非常有价值的。例如,下面的命令修改了日期的缺省输出,以便以日 月,年 的格式进行输出:
到目前为止,示例中的字段都使用空格字符进行分隔。这是缺省的行为,即任意个数的空格或制表符,您可以对其进行更改。字段分隔符的值保存在 FS 变量中。与 AWK 中的其他变量一样,可以在程序中的任何位置对其进行重新定义。要对整个文件使用不同的字段分隔符,可以在 BEGIN 语句重新定义它。 使用感叹号 (!) 作为字段分隔符打印示例数据的第 1 个字段:
请注意在打印第 2 个和第 3 个字段时的差别:
尝试将输出中的字段与图 4 中列出的字段进行比较。 但是字段分隔符并不一定必须是单个字符。可以使用一个短语:
在 GAWK 中,字段分隔符可以是任何正则表达式。要使每个输入字符成为一个独立的字段,可以让 FS 的值为空。 算出大写字母的总数。上面的示例仅在整个文件中匹配一个分隔符,而下面的示例将匹配短语,无论大小写:
通过在命令行中使用引号将其括起来并作为 -F 选项的参数,也可以更改字段分隔符:
使用这种功能,很容易创建可以对文件进行解析的单行程序,如 /etc/passwd,其中的字段由冒号 (:) 进行分隔。您可以轻松地从中提取完整的用户名称列表,例如:
与字段分隔符一样,您可以将记录分隔符的缺省值(换行符)更改为所需的任何内容。其当前值保存在 RS 变量中。 将记录分隔符更改为逗号,并对示例文件使用它:
对 AWK 输出的处理与 AWK 输入数据一样,它被分解为许多字段和记录,输出流具有自己的分隔符,初始情况下与输入分隔符的缺省值相同,即空格和换行。print 语句中的字段由逗号分隔,该语句中使用的输出字段分隔符 设置为单个空格,您可以重新定义 OFS 变量,以对其进行更改。输出记录分隔符 设置为换行符,您可以通过重新定义 ORS 变量对其进行更改。 要从文件中删除所有的换行,并将文件中所有的文本置于一行,只需将输出记录分隔符更改为空字符即可,对于某些文本分析和筛选来说,这样做是非常有价值的。 使用示例文件尝试下面的命令:
删除了所有的换行,包括最后一个。返回的 Shell 提示符与输出数据出现在同一行中。要在结尾添加一个换行,可以将其放在 END 规则中:
NF 变量包含当前记录中字段的个数。使用 NF 可以引用其数值,而使用 $NF 则表示引用实际字段本身的内容。所以,如果记录有 100 个字段,print NF 将输出整数 100,而 print $100 则与 print $NF 输出相同的结果,都是该记录中最后一个字段的内容。 NR 变量包含当前的记录个数。当读取到第 1 个记录时,其值为 1,当读取到第 2 个记录时,其值增为 2,依此类推。在 END 模式中使用它,以便输出输入中的行数:
注意:如果上面的 print 语句位于 BEGIN 模式中,那么该程序将报告其输入包含 0 行内容,因为在执行时 NR 的值为 0,因为此时尚未读入任何输入记录。 使用 $NR 打印相对于当前记录个数的字段:
再来研究一下图 4,可以看到第 1 个记录中的字段 1 的值、第 2 个记录中的字段 2 的值,以及最后一个记录中字段 3 的值。将其与您的程序输出进行比较。 尝试列出每个记录中字段的个数,以及最后一个字段的值:
通常可以使用大量特殊的 GAWK 变量。表 2 列出了这些变量,并对其含义进行了描述。 表 2. 常见的 GAWK 变量
|