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

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}'
我在命令行定义的变量

 

posted @ 2018-05-25 23:16 ghostwu 阅读(...) 评论(...) 编辑 收藏
Copyright ©2017 ghostwu