AWK中,变量分为两种:内置变量与自定义变量。
常见的内置变量有:
FS:输入字段分隔符, 默认为空白字符
OFS:输出字段分隔符, 默认为空白字符
RS:输入记录分隔符(输入换行符), 指定输入时的换行符
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量
NR:行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
下面的NF 打印出每行有多少列:
ghostwu@dev:~/linux/awk$ awk '{print NF}' ghostwu.txt 1 2 3 ghostwu@dev:~/linux/awk$ cat ghostwu.txt ghostwu zhangsan 22 lisi 23 woman
引用NF变量,需要用美元符号
ghostwu@dev:~/linux/awk$ cat ghostwu.txt ghostwu 20 man zhangsan 22 woman lisi 23 woman ghostwu@dev:~/linux/awk$ awk '{print $NF}' ghostwu.txt man woman woman ghostwu@dev:~/linux/awk$ awk '{print $(NF-2), $(NF-1), $(NF)}' ghostwu.txt ghostwu 20 man zhangsan 22 woman lisi 23 woman
NR:每一行的行号:
ghostwu@dev:~/linux/awk$ awk '{print NR,$0}' ghostwu.txt 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman
1,awk支持多文件扫描,如果采用NR, 下一个文件的行序号会接着上一个文件,FNR就会单独统计
ghostwu@dev:~/linux/awk$ awk '{print NR, $0}' ghostwu.txt ghostwu.bak 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman 4 ghostwu 20 man 5 zhangsan 22 woman 6 lisi 23 woman ghostwu@dev:~/linux/awk$ awk '{print FNR, $0}' ghostwu.txt ghostwu.bak 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman
2,RS指定行输入符,默认为回车换行,如果我们想让他以空格作为行输入符( 即,遇到空格就换行 ),当我们指定使用空格作为"行分隔符"时,在awk解析文本时,每当遇到空格,awk就认为遇到的空格是换行符,于是awk就将文本换行了
ghostwu@dev:~/linux/awk$ awk '{print NR, $0}' ghostwu.txt 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman ghostwu@dev:~/linux/awk$ awk -v RS=" " '{print NR, $0}' ghostwu.txt 1 ghostwu 2 20 3 man zhangsan 4 22 5 woman lisi 6 23 7 woman
3,ORS指定输出行分隔符
ghostwu@dev:~/linux/awk$ awk -v ORS='---->' '{print $0}' ghostwu.txt ghostwu 20 man---->zhangsan 22 woman---->lisi 23 woman---->ghostwu@dev:~/linux/awk$
4,可以同时指定,输入,输出行分隔符
ghostwu@dev:~/linux/awk$ awk -v RS=" " -v ORS='->' '{print $0}' ghostwu.txt ghostwu->20->man zhangsan->22->woman lisi->23->woman
5,FILENAME:文件名称
ghostwu@dev:~/linux/awk$ awk '{print FILENAME, NR, $0}' ghostwu.txt ghostwu.bak ghostwu.txt 1 ghostwu 20 man ghostwu.txt 2 zhangsan 22 woman ghostwu.txt 3 lisi 23 woman ghostwu.bak 4 ghostwu 20 man ghostwu.bak 5 zhangsan 22 woman ghostwu.bak 6 lisi 23 woman
6,ARGV保存命令行参数的数组,'pattern{action}'并不被看做参数
ghostwu@dev:~/linux/awk$ awk '{print ARGV[0], ARGV[1], ARGV[2]}' ghostwu.txt awk ghostwu.txt awk ghostwu.txt awk ghostwu.txt
7,ARGC:命令行参数的个数,下例:ARGV[1]没有值,因为命令行没有给第三个参数
ghostwu@dev:~/linux/awk$ awk '{print ARGV[0], ARGV[1], ARGV[2], ARGC}' ghostwu.txt awk ghostwu.txt 2 awk ghostwu.txt 2 awk ghostwu.txt 2
自定义变量:用户自己定义的变量,有两种形式
1,-v varname=value 变量名区分字符大小写
ghostwu@dev:~/linux/awk$ awk -v my_name="ghostwu" 'BEGIN{print my_name}' ghostwu
2,在program中直接定义,以下定义了3个自定义变量,其实形式像编程语言一样,定义的时候用分号。打印变量跟之前一样,用逗号隔开,注意,不需要用美元符号.
ghostwu@dev:~/linux/awk$ awk 'BEGIN{ my_name="ghost"; my_age=22; my_sex="男"; print my_name, my_age, my_sex}' ghost 22 男
3,也可以引用命令行定义的变量
ghostwu@dev:~/linux/awk$ echo $myvar ghostwu@dev:~/linux/awk$ myvar="我在命令行定义的变量" ghostwu@dev:~/linux/awk$ awk -v var1=$myvar 'BEGIN{print var1}' 我在命令行定义的变量