NR:表示awk开始执行程序后所读取的数据行数。

FNR:与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计。

下面给出2个示例,展示awk的NR、FNR、next的用法。

示例1:
文件file1内容:

$ cat file1

0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401

文件file2内容:

cat file2

I0011  11111
I0012  22222
I0014  55555
I0013  66666

规则:比较 file1的1-4字符 和 file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并 file3。

awk -F'[ a-zA-Z]' 'NR==FNR{a[$2]=$4;next}{print $0,a[$1]}' file2 file1

首先,设定域分隔符为空格或者是匹配a-zA-Z正则的一个字母。

当NR==FNR,读取file2的时候构建一个数组,下标是第2个域,值是第4个域(拿第1行来举例,就是:a[0011]=11111), 然后遇到next命令,不再执行后面的语句,循环读取新的一行继续执行构建数组的命令,直到NR==FNR失败。

当NR==FNR为false的时候,读取 file1,输出file1中的所有内容,再输出a[$1]。因为file1中 $1的值和file2中$2的值是相同的,所以a[$1]等于我们前面设定的 file中a[$2]的值,最终得到上面的结果。

结果如下所示:

0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555

示例2:

文件passwd内容:

cat passwd

s2002408030068:x:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:x:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:x:529:529::/home/dz02/s2002408032823:/bin/pw

文件shadow内容:

cat shadow

s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:12676:0:99999:7:::
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:12676:0:99999:7:::
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:12676:0:99999:7:::

用shadow文件中的密文部分替换passwd中的"x",生一个新passwd文件,命令为:

awk -F':' 'NR==FNR{a[$1]=$2;next}{gsub($2,a[$1]);print $0}' shadow passwd

首先,设定域分隔符为":" 。

当NR==FNR,读取shadow,构件数组a,下标为$1,值为$2,通过next命令控制shadow文件读取。

然后,读取passwd文件,通过gsub命令进行全局替换。将passwd中的第2字段替换成a[$1]的值,然后用print进行输出(注意:sub、gsub函数都是会改变原始内容的)。

结果如下所示:
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:529:529::/home/dz02/s2002408032823:/bin/pw

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐