一、FS –输入字段分隔符
FS是awk内置变量,用来制定行分隔符,功能能-F一样,区别在于FS只能用在BEGIN语句块当中,命令格式如下:
BEGIN{FS="SEPARATOR"}
实例1:
[root@localhost ~]# awk 'BEGIN { FS=",";\ print "---------------------------\nName\tTitle\n------------------------"}\ {print $2,"\t",$3;}\ END {print "-----------------------------------------"}' emp --------------------------- Name Title ------------------------ John Doe CEO Jason Smith IT Manager Raj Reddy Sysadmin Anand Ram Developer Jane Miller Sales Manager -----------------------------------------
注意:默认的字段分隔符不仅仅是单个空格字符,它实际上是一个或多个空白字符。
当遇到一个包含多个字段分隔符的文件时,你可以使用正则表达式来指定多个字段分隔符,如 FS = “[,:%]” 指定字段分隔符可以是逗号 ,或者分号 : 或者百分号 % 。
实例2:
[root@localhost ~]# cat emp1 101,John Doe:CEO%10000 102,Jason Smith:IT Manager%5000 103,Raj Reddy:Sysadmin%4500 104,Anand Ram:Developer%4500 105,Jane Miller:Sales Manager%3000 [root@localhost ~]# awk 'BEGIN{FS="[,:%]"}{print $2,"\t",$3}' emp1 #使用正则表达式匹配 John Doe CEO Jason Smith IT Manager Raj Reddy Sysadmin Anand Ram Developer Jane Miller Sales Manager
二、OFS – 输出字段分隔符
FS 是输入字段分隔符,OFS 是输出字段分隔符。OFS 会被打印在输出行的连续的字段之间。 默认情况下,awk 在输出字段中间以空格分开。
实例1:
[root@localhost ~]# awk 'BEGIN{FS=",";OFS=":"}{print $2,$3}' emp John Doe:CEO Jason Smith:IT Manager Raj Reddy:Sysadmin Anand Ram:Developer Jane Miller:Sales Manager
注意与下面情况区分,如下情况会多输出空格字符:
[root@localhost ~]# awk -F, '{print $2,":",$3}' emp John Doe : CEO Jason Smith : IT Manager Raj Reddy : Sysadmin Anand Ram : Developer Jane Miller : Sales Manager
实例3:使用逗号与不使用逗号的区别
[root@localhost ~]# awk 'BEGIN{print "text1","text2"}' #使用逗号默认使用OFS text1 text2 [root@localhost ~]# awk 'BEGIN{print "text1""text2"}' #不使用逗号默认不使用OFS text1text2
三、RS – 记录分隔符
Awk 默认的记录分隔符是换行符。
实例1:将文件emp2内容作为 5 行记录来处理(而不是单独的一行), 并且打印每条记录中雇员的姓名
[root@localhost ~]# cat emp2 101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane, Miller [root@localhost ~]# awk -F, 'BEGIN{RS=":"}{print $2}' emp2 #将冒号结尾当做一行处理 John Doe Jason Smith Raj Reddy Anand Ram Jane
实例2:打印emp3文件中雇员名称和职位
[root@localhost ~]# cat emp3 101 John Doe CEO - 102 Jason Smith IT Manager - 103 Raj Reddy Sysadmin - 104 Anand Ram Developer - 105 Jane Miller Sales Manager [root@localhost ~]# awk 'BEGIN{RS="-\n";FS="\n"}{print $2,$3}' emp3 John Doe CEO Jason Smith IT Manager Raj Reddy Sysadmin Anand Ram Developer Jane Miller Sales Manager
四、ORS – 输出记录分隔符
ORS 是输出字段分隔符,默认输出字段分隔符为换行。
实例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 ~]# awk 'BEGIN{FS=",";ORS="\n---------\n"}{print $2,$3}' emp John Doe CEO --------- Jason Smith IT Manager --------- Raj Reddy Sysadmin --------- Anand Ram Developer --------- Jane Miller Sales Manager ---------
实例2:把每个字段打印成单独一行,每条记录用”—“分隔
[root@localhost ~]# awk 'BEGIN{FS=",";OFS="\n";ORS="\n---\n"}{print $1,$2,$3}' emp 101 John Doe CEO --- 102 Jason Smith IT Manager --- 103 Raj Reddy Sysadmin --- 104 Anand Ram Developer --- 105 Jane Miller Sales Manager ---
五、NR – 记录序号
NR 非常有用,在循环内部标识记录序号。用于 END 区域时,代表输入文件的总记录数。确切的叫法是”记录的序号”(Number of the Record)”,也就是当前记录在所有记录中的行号。
注意:NR 会在多个文件中持续增加,当处理到第二个文件时, NR 不会被重置为 1,而是在前一个文件的 NR 基础上继续增加。
实例1:多文件打印行号
1 |
|
实例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:数组,保存的是命令行所给定的各参数。
实例1:
[root@localhost ~]# awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/passwd #awk命令自身也包括 awk [root@localhost ~]# awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/passwd /etc/fstab [root@localhost ~]# awk 'BEGIN {print ARGV[2]}' /etc/fstab /etc/passwd /etc/passwd
十一、$NF – 最后字段内容
$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}' /bin/bash [root@localhost ~]# head -1 /etc/passwd|awk -F: '{print $(NF-1)}' /root [root@localhost ~]# head -1 /etc/passwd|awk -F: '{print $(NF-2)}' young,geek,010110110,0101101101
十二、IGNORECASE – 忽略大小写
默认情况下, IGNORECASE 的值是 0,所有 awk 区分大小写。当把 IGNORECASE 的值设置为 1 时, awk 则不区分大小写,这在使用正则表达式和比较字符串时很有效率。
实例1:
[root@localhost ~]
# cat items.txt
101,HD Camcorder,Video,210,10
102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5
[root@localhost ~]
# cat ign.awk
BEGIN {
FS=
","
;
IGNORECASE=1;
} {
if
($3 ==
"video"
) print $0;
if
($2 ~
"TENNIS"
) print $0;
}
[root@localhost ~]
# awk -f ign.awk items.txt
101,HD Camcorder,Video,210,10
104,Tennis Racket,Sports,190,20
[root@localhost ~]
# awk 'BEGIN{IGNORECASE=1} /video/{print}' items.txt
101,HD Camcorder,Video,210,10
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140317.htm