# ARGC : awk命令行参数个数
$ awk 'BEGIN {print "ARGC=" ARGC}'
ARGC=1
$ awk 'BEGIN {print "ARGC=" ARGC}' test1 test2
ARGC=3
# ARGV : 命令行参数数组,存储命令行参数的数组,索引范围从0 - ARGC - 1。
$ awk 'BEGIN {print "ARGV[0]=" ARGV[0]}'
ARGV[0]=awk
$ awk 'BEGIN {print "ARGV[1]=" ARGV[1] "\t" "ARGV[2]=" ARGV[2]}' test1 test2
ARGV[1]=test1 ARGV[2]=test2
# 循环输出ARGV数组中的参数值
$ awk 'BEGIN {
for (i = 0; i <= ARGC - 1; i++) {
print "ARGV[" i "] = " ARGV[i]
printf "ARGV[%d] = %s\n", i, ARGV[i]
}
}' test1 test2
ARGV[0] = awk
ARGV[0] = awk
ARGV[1] = test1
ARGV[1] = test1
ARGV[2] = test2
ARGV[2] = test2
# 这里顺便说一下print和printf函数的区别
# print函数是不格式化直接输出函数,默认自动换行
# printf()函数是格式化输出函数,默认不会自动换行
# 上面是printf()函数的简写方式,完整的写法应该如下
$ awk 'BEGIN {
for (i = 0; i <= ARGC - 1; i++) {
print "ARGV[" i "] = " ARGV[i]
printf("ARGV[%d] = %s\n", i, ARGV[i])
}
}' test1 test2
ARGV[0] = awk
ARGV[0] = awk
ARGV[1] = test1
ARGV[1] = test1
ARGV[2] = test2
ARGV[2] = test2
# CONVFMT : 此变量表示数据转换为字符串的格式,其默认值为 %.6g
$ awk 'BEGIN { print "Conversion Format =" CONVFMT }'
Conversion Format = %.6g
# ENVIRON : 此变量是与环境变量相关的关联数组变量,以key-value的方式查看系统环境变量的值。
$ awk 'BEGIN { print ENVIRON["JAVA_HOME"] }'
/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
# FILENAME : 此变量表示当前文件名称。
# 注意:这里一定要是END才能读取到文件名,因为在BEGIN开始快还没有开始读取文件test.txt的内容,也就是FILENAME是未定义的。
$ awk 'END {print "FILENAME = " FILENAME}' test.txt
FILENAME = test.txt
# FS : 此变量表示输入的数据域之间的分隔符,其默认值是空格。你可以使用 -F 命令行选项改变它的默认值。
$ awk 'BEGIN {print "FS = " FS}' | cat -vte
FS = $
# NF : 此变量表示当前输入记录中域的数量。(简单理解,域:当前行用分隔符分开数据的就是数据域,如下面的例子,One,Two,Three都是数据域)
# 输出每一行的数据域数量
$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk '{print "NF = " NF}'
NF = 2
NF = 3
NF = 4
# 输出每一行的数据域数量大于2的
$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'
$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2 {print}'
One Two Three
One Two Three Four
# NR : 此变量表示当前记录的数量。
# 输出每一行的当前记录数量,也就是当前行的游标
$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk '{print "NR = " NR}'
NR = 1
NR = 2
NR = 3
# 输出每一行的当前记录的游标大于2的
$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR > 2 {print}'
One Two Three Four
# FNR : 该变量与 NR 类似,不过它是相对于当前文件而言的。此变量在处理多个文件输入时有重要的作用。每当从新的文件中读入时 FNR 都会被重新设置为 0。
$ awk '{print "FNR = " FNR "\t" "NR = " NR}' test.txt test1.txt
FNR = 1 NR = 1
FNR = 2 NR = 2
FNR = 3 NR = 3
FNR = 4 NR = 4
FNR = 5 NR = 5
FNR = 1 NR = 6
FNR = 2 NR = 7
FNR = 3 NR = 8
FNR = 4 NR = 9
FNR = 5 NR = 10
# OFMT : 此变量表示数值输出的格式,它的默认值为 %.6g。
$ awk 'BEGIN {print "OFMT = " OFMT}'
OFMT = %.6g
# OFS : 此变量表示输出域之间的分割符,其默认为空格。
$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte
# 这里^I就是我们test.txt的分隔符:制表符\t
$ awk 'BEGIN {print "OFS = " OFS} {print}' test.txt | cat -vte
OFS = $
1^Ibirdben^I^Ibejing^I^I28$
2^Ierhuo^I^Ishanghai^I30$
3^Izhangsan^Ishanghai^I20$
4^Ilisi^I^Ishenzhen^I25$
5^Iwangwu^I^Ibeijing^I^I28$
# ORS : 此变量表示输出记录(行)之间的分割符,其默认值是换行符。
$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte
ORS = $
$
# RLENGTH : 此变量表示 match 函数匹配的字符串长度。AWK 的 match 函数用于在输入的字符串中搜索指定字符串。
$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'
# RS : 此变量表示输入记录的分割符,其默认值为换行符。
$ awk 'BEGIN {print "RS = " RS}' | cat -vte
RS = $
$
# RSTART : 此变量表示由 match 函数匹配的字符串的第一个字符的位置。从1开始。
$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'
# SUBSEP : 此变量表示数组下标的分割行符,其默认值为 \034 。
$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte
SUBSEP = ^\$
# $0 : 此变量表示整个输入记录。
$ awk '{print $0}' test.txt
1 birdben bejing 28
2 erhuo shanghai 30
3 zhangsan shanghai 20
4 lisi shenzhen 25
5 wangwu beijing 28
# $n : 此变量表示当前输入记录的第 n 个域,这些域之间由 FS 分割。
$ awk '{print $1 "\t" $2}' test.txt
1 birdben
2 erhuo
3 zhangsan
4 lisi
5 wangwu