分类: LINUX
2010-03-19 17:25:21
前面一篇文章《awk示例(二)》主要讲解了awk中用户定义的变量,本文主要讲解awk自己的特殊变量。
首先开看字段分隔符FS,这个变量让您可以设置awk要查找的字段之间的字符序列。前面文章中我们使用address.in作为输入时,就是将 FS 设置成 ":"。其实FS 值并没有被限制为单一字符;可以通过指定任意长度的字符模式,将它设置成规则表达式。如果我们的address.in是由一个或多个 tab 分隔的字段,而不是“:”,则可以按以下方式设置 FS:
FS="\t+"
以上示例中,\t表示tab分割,我们使用特殊 "+" 规则表达式字符,它表示“一个或多个前一字符”,也就是一个或多个 tab。如果字段由空格分隔(一个或多个空格或 tab),则不需要设置FS,因为缺省FS就代表空格分隔。FS还可以是复杂的规则表达式。若我们的address.ini文件由"sep" 分隔,后面跟着三个数字,则以下规则表达式仍允许对数据进行正确的分析:
FS="sep[0-9][0-9][0-9]"
下面我们来看看“字段数量”NF变量,awk 会自动将该变量设置成当前记录中的字段数量。我们可以在条件语句中使用 NF 变量,如下面示例将判断输入文件中字段数量是否超过2个,若超过两个则显示每行的前三个字段:
{
if ( NF > 2 ) {
print $1 " " $2 " " $3
}
}
假设名为address.in的文件内容如下:
1:abc:male:13612345678
2:mary:female:12345678
3:aaa:female:44445555
4:zlx:female:13550000000
5:lucy:female:13611111111
6:david:male:10101010
若test.awk内容为:
BEGIN {
FS=":"
}
{
if ( NF > 2 ) {
print $1 " " $2 " " $3
}
}
则执行awk -f test.awk address.in后,结果为:
1 abc male
2 mary female
3 aaa female
4 zlx female
5 lucy female
6 david mal
但若address.in的文件内容为:
1:abc
2:mary
3:aaa
4:zlx
5:lucy
6:david
则执行awk -f test.awk address.in后屏幕上将没有任何输出。
最后,我们来看看记录号 (NR)变量,它始终包含当前记录的编号(awk 将第一个记录算作记录号 1)。还以本文开头部分的address.in文件为例,若test.awk内容为:
BEGIN {
FS=":"
}
{
if ( NR > 3) {
print $0
}
}
则执行awk -f test.awk address.in后,结果为:
4:zlx:female:13550000000
5:lucy:female:13611111111
6:david:male:10101010
也就是说该示例只打印记录号大于3的后三条记录。好了,本文就讲到这儿,通过前面的几篇文章,大家可以发现,awk非常擅长于文本处理,以后继续通过具体例子进一步讲解awk的特性。