AWK 内置变量和自定义变量

变量参数

变量 作用
FS 输入字段分隔符, 默认为空白字符
OFS 输出字段分隔符,默认为空白字符
RS 输入记录分隔符(输入换行符),指定输入时的换行符
ORS 输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF 当前行的字段数(即当前行的列数)
NR 行号,当前处理的文本的行号
FNR 各文件分别计数的行号
FILENAME 当前文件名
ARGC 命令行参数的个数
ARGV 数组,保存的是命令行所给定的各参数

内置变量

  • 内置变量NR

输出passwd文件中每一行的行号

[root@shell ~]# awk '{print NR,$0}' passwd 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@shell ~]# 
  • 内置变量FNR

分别显示每个文件的行号

#使用NR打印行号
[root@shell ~]# awk '{print NR,$0}' passwd sfz.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 adm:x:3:4:adm:/var/adm:/sbin/nologin
4 wbh 123455466542341653
5 qh  12345235464234112X
6 xxf a23455123142342342
[root@shell ~]# 

#使用FNR显示行号
[root@shell ~]# awk '{print FNR,$0}' passwd sfz.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 adm:x:3:4:adm:/var/adm:/sbin/nologin
1 wbh 123455466542341653
2 qh  12345235464234112X
3 xxf a23455123142342342
[root@shell ~]# 
  • 内置变量RS

RS是输入行分隔符,如果不指定,默认的"行分隔符"就是我们所理解的"回车换行"。

[root@shell ~]# awk '{print NR,$0}' test1.txt 
1 abc aaa eee sss
2 fea iaa att 9kk ssf
[root@shell ~]# 

#默认是以回车为行分隔符,指定" "为行分隔符
[root@shell ~]# awk -v RS=" " '{print NR,$0}' test1.txt 
1 abc
2 aaa
3 eee
4 sss
fea
5 iaa
6 att
7 9kk
8 ssf
[root@shell ~]# 
  • 内置变量ORS

ORS是输出行分隔符,awk默认将“回车换行”当做“输出换行符”,可以用ORS定义输出行分隔符。

[root@shell ~]# awk '{print $0}' test1.txt 
1 abc aaa eee sss
2 fea iaa att 9kk ssf

#设置“++++”为输出分隔符号
[root@shell ~]# awk -v ORS="++++" '{print NR,$0}' test1.txt 
1 abc aaa eee sss++++2 fea iaa att 9kk ssf++++[root@shell ~]# 

#设置“ ”为输入换分符,“++++”为输出换行符
[root@shell ~]# awk -v RS=" " -v ORS="++++" '{print NR,$0}' test1.txt 
1 abc++++2 aaa++++3 eee++++4 sss
fea++++5 iaa++++6 att++++7 9kk++++8 ssf
++++[root@shell ~]# 
  • 内置变量FILENAME

FILENAME变量,是显示文件名

[root@shell ~]# awk '{print FILENAME,FNR,$0}' test1.txt 
test1.txt 1 abc aaa eee sss
test1.txt 2 fea iaa att 9kk ssf
[root@shell ~]# 
  • 内置变量ARGV

ARGV表示一个数组,这个数组中保存的是命令行所给定的参数。

[root@shell ~]# awk 'BEGIN{print "aaa"}' test1 test2
aaa
[root@shell ~]# awk 'BEGIN{print "aaa",ARGV[1]}' test1 test2
aaa test1
[root@shell ~]# awk 'BEGIN{print "aaa",ARGV[1],ARGV[2]}' test1 test2
aaa test1 test2
[root@shell ~]# 

可以看到,先用BEGIN模式,输出一个字符串“aaa”,然后,传入两个文件的文件名作为参数,BEGIN模式正常执行了打印操作,输出了“aaa”字符串。当使用ARGV的时候,BEGIN模式把参数作为数组的值打印了出来。

ARGV[1]表示引用ARGV数组中的第二个元素的值,即对应的值为test1;ARGV[2]对应的值为test2(引用ARGV数组中的第三个元素)

[root@shell ~]# awk 'BEGIN{print "aaa",ARGV[0],ARGV[1],ARGV[2]}' test1 test2
aaa awk test1 test2
[root@shell ~]# 

这里需要注意下,ARGV数组中第一个元素的值ARGV[0];在awk的规定中,pattern{ action }并不被看做是参数,awk会被看做为参数,即ARGV[0]对应的值为awk。

  • 内置变量ARGC

ARGC表示的是命令行参数的个数

[root@shell ~]# awk 'BEGIN{print "aaa",ARGV[0],ARGV[1],ARGV[2],ARGC}' test1 test2
aaa awk test1 test2 3
[root@shell ~]# 

自定义变量

  • 方法一:-v varname=value
[root@shell ~]# awk -v Var_URL="www.wanhebin.com" 'BEGIN{print Var_URL}'
www.wanhebin.com
[root@shell ~]# 
  • 方法二:在prograrm中直接定义
 [root@shell ~]# awk 'BEGIN{ var_url="www.wanhebin.com"; print var_url}'
www.wanhebin.com
[root@shell ~]# awk 'BEGIN{ myvar1="111"; myvar2="222";print myvar1,myvar2}'
111 222
[root@shell ~]#
点赞

发表回复