Linux常用基本命令:三剑客命令之-awk内置变量与自定义变量

时间:2022-06-04 10:14:23

AWK中,变量分为两种:内置变量与自定义变量。

常见的内置变量有:

FS:输入字段分隔符, 默认为空白字符

OFS:输出字段分隔符, 默认为空白字符

RS:输入记录分隔符(输入换行符), 指定输入时的换行符

ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符

NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量

NR:行号,当前处理的文本行的行号。

FNR:各文件分别计数的行号

FILENAME:当前文件名

ARGC:命令行参数的个数

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

下面的NF 打印出每行有多少列: 

ghostwu@dev:~/linux/awk$ awk '{print NF}' ghostwu.txt 

ghostwu@dev:~/linux/awk$ cat ghostwu.txt
ghostwu
zhangsan
lisi woman

引用NF变量,需要用美元符号

ghostwu@dev:~/linux/awk$ cat ghostwu.txt
ghostwu man
zhangsan woman
lisi 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 man
zhangsan woman
lisi woman

NR:每一行的行号:

ghostwu@dev:~/linux/awk$ awk '{print NR,$0}' ghostwu.txt
ghostwu man
zhangsan woman
lisi woman

1,awk支持多文件扫描,如果采用NR, 下一个文件的行序号会接着上一个文件,FNR就会单独统计

ghostwu@dev:~/linux/awk$ awk '{print NR, $0}' ghostwu.txt ghostwu.bak
ghostwu man
zhangsan woman
lisi woman
ghostwu man
zhangsan woman
lisi woman
ghostwu@dev:~/linux/awk$ awk '{print FNR, $0}' ghostwu.txt ghostwu.bak
ghostwu man
zhangsan woman
lisi woman
ghostwu man
zhangsan woman
lisi woman

2,RS指定行输入符,默认为回车换行,如果我们想让他以空格作为行输入符( 即,遇到空格就换行 ),当我们指定使用空格作为"行分隔符"时,在awk解析文本时,每当遇到空格,awk就认为遇到的空格是换行符,于是awk就将文本换行了

ghostwu@dev:~/linux/awk$ awk '{print NR, $0}' ghostwu.txt
ghostwu man
zhangsan woman
lisi woman
ghostwu@dev:~/linux/awk$ awk -v RS=" " '{print NR, $0}' ghostwu.txt
ghostwu man
zhangsan woman
lisi woman

3,ORS指定输出行分隔符

ghostwu@dev:~/linux/awk$ awk -v ORS='---->' '{print $0}' ghostwu.txt
ghostwu man---->zhangsan woman---->lisi woman---->ghostwu@dev:~/linux/awk$

4,可以同时指定,输入,输出行分隔符

ghostwu@dev:~/linux/awk$ awk -v RS=" " -v ORS='->' '{print $0}' ghostwu.txt
ghostwu->->man
zhangsan->->woman
lisi->->woman

5,FILENAME:文件名称

ghostwu@dev:~/linux/awk$ awk '{print FILENAME, NR, $0}' ghostwu.txt ghostwu.bak
ghostwu.txt ghostwu man
ghostwu.txt zhangsan woman
ghostwu.txt lisi woman
ghostwu.bak ghostwu man
ghostwu.bak zhangsan woman
ghostwu.bak lisi 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
awk ghostwu.txt
awk ghostwu.txt

自定义变量:用户自己定义的变量,有两种形式

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 男

3,也可以引用命令行定义的变量

ghostwu@dev:~/linux/awk$ echo $myvar

ghostwu@dev:~/linux/awk$ myvar="我在命令行定义的变量"
ghostwu@dev:~/linux/awk$ awk -v var1=$myvar 'BEGIN{print var1}'
我在命令行定义的变量