Linux高级文本处理之gawk内置变量(2)

NR 非常有用,在循环内部标识记录序号。用于 END 区域时,代表输入文件的总记录数。确切的叫法是"记录的序号"(Number of the Record)”,也就是当前记录在所有记录中的行号。

注意:NR 会在多个文件中持续增加,当处理到第二个文件时, NR 不会被重置为 1,而是在前一个文件的 NR 基础上继续增加。

实例1:多文件打印行号

1

 

[root@localhost ~]# awk '{print NR,$1}' emp emp1 1 101,John 2 102,Jason 3 103,Raj 4 104,Anand 5 105,Jane 6 101,John 7 102,Jason 8 103,Raj 9 104,Anand 10 105,Jane

 

实例2:

[root@localhost ~]# awk 'BEGIN{FS=","} > {print "Emp id of record number",NR,"is",$1;} > END{print "Total number of records:",NR}' emp Emp id of record number 1 is 101 Emp id of record number 2 is 102 Emp id of record number 3 is 103 Emp id of record number 4 is 104 Emp id of record number 5 is 105 Total number of records: 5

实例3:BEGIN中的NR值为0

[root@localhost ~]# awk 'BEGIN{print NR}{print $1}' emp emp1    0 101,John 102,Jason 103,Raj 104,Anand 105,Jane 101,John 102,Jason 103,Raj 104,Anand 105,Jane 六、FILENAME – 当前处理的文件名

当使用 awk 处理多个输入文件时, FILENAME 就显得很有用,它代表 awk 当前正在处理的文 件。

实例1:

[root@localhost ~]# cat emp 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager [root@localhost ~]# cat emp2 101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane, Miller [root@localhost ~]# awk '{print FILENAME,$1}' emp emp2 emp 101,John emp 102,Jason emp 103,Raj emp 104,Anand emp 105,Jane emp2 101,John

如果 awk 从标准输入获取内容, FILENAME 的值将会是"-"。

实例二:从标准输入获取内容

[root@localhost ~]# awk '{print "Last name",$2;print "Filename:",FILENAME}' John Deo  Last name Deo Filename: -

管道一样:

[root@localhost ~]# echo "John Doe"|awk '{print "Last name:",$2;print "Filename:",FILENAME}'Last name: Doe Filename: -

注意:在 BEGIN 区域内, FILENAME 的值是空,因为 BEGIN 区域只针对 awk 本身,而不处理任何文件。

[root@localhost ~]# echo "John Doe"|awk ' >BEGIN{print FILENAME} >{print "Last name:",$2;print "Filename:",FILENAME} >END{print FILENAME}'  Last name: Doe Filename: - - 七、FNR – 文件中的 NR

awk处理多文件时FNR与NR不同的地方在于,NR连续计数,处理完第一个文件后第二个文件的NR数不会置零,FNR会置零重新计算。

实例1:同时打印 NR 和 FNR

[root@localhost ~]# awk '{print FILENAME,"NR is",NR";""FNR is",FNR}' emp emp2 emp NR is 1;FNR is 1     #emp文件5行,emp2文件1行 emp NR is 2;FNR is 2 emp NR is 3;FNR is 3 emp NR is 4;FNR is 4 emp NR is 5;FNR is 5 emp2 NR is 6;FNR is 1 八、NF - 字段数量

实例1:

[root@localhost ~]# head -1 /etc/passwd root:x:0:0:young,geek,010110110,0101101101:/root:/bin/bash [root@localhost ~]# head -1 /etc/passwd|awk -F: '{print NF}' 7 九、ARGC - 命令行参数的个数

ARGC表示命令行中awk命令后面跟的参数的个数,包含awk命令自身。

实例1:

[root@localhost ~]# awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab  3 [root@localhost ~]# awk 'BEGIN {print ARGC}' /etc/fstab 2 [root@localhost ~]# awk 'BEGIN {print ARGC}' 十、ARGV - 命令行保存参数内容

ARGV:数组,保存的是命令行所给定的各参数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14368.html