Linux/Unix中,AWK是一个非常强大的命令,平时的运维工作中经常会用到,熟练掌握AWK的用法能大大提升运维工作的效率。本篇文章将介绍AWK命令使用变量时需要注意的地方,学会了AWK变量的使用方式,AWK将会用得更加顺畅。
1. 在awk中自定义变量
通过-v参数便可以自定义变量传递给awk使用,如下所示:
# awk -v var='bianliang' 'BEGIN{print var}'
bianliang
如果是BEGIN块中调用的话,变量的定义必须紧邻awk命令。如果变量定义在BEGIN块之后(如下),显示的结果将为空:
# awk 'BEGIN{print var}' -v var='bianliang'
为了养成一个好的脚本编写习惯,建议所有的变量都使用第一种习惯,紧邻awk命令加-v参数进行变量定义。
2. 在awk中使用bash传递的变量
类似自定义变量,在脚本中可以轻易的用-v参数将bash的变量传递给awk,如下所示:
# name=sni7
# awk -v var=${name} 'BEGIN{print var}'
sni7
传入SHELL变量时,最好加上双引号,避免因传入的变量是多个字符串导致awk命令报错,如下所示:
$ info='this is'
$ awk -v var=${info} 'BEGIN{print var}'
awk: cmd. line:1: fatal: cannot open file `BEGIN{print var}' for reading (No such file or directory)
3. awk中定义多个变量
在定义每个变量的时候,都必须重新加入-v参数,如:
# awk -v year=2023 -v month=04 '$2 ~ year"/"month"/[0123]" {print $2,$3,$NF}' file.lst
以上awk命令的含义是:匹配file.lst中,第二列为“2023/04/**”(即日期是2013年4月份某天)这样格式的内容,将第二列、第三列和最后一列打印输出。注意,$2、$3、$NF都是系统变量,系统变量是需要前缀的,但是自定义变量不需要任何前缀(遇到的问题:内置变量引用方式有待考证,经验证,在Redhat、AIX下,除$0~$n之外,其余内置变量引用时不需要前缀$)。
同时为了区分自定义变量和普通文本,在输出文本的时候需要使用双引号将文本引用起来。