用户自定义变量的变量名可以由字母、数字和下划线组成,但是不能以数字开头。awk的变量不用声明其类型,awk可以从变量在表达式中的上下文推导出它的数据类型。如果变量未被初始化,awk会将字符串变量初始化为空串,将数值变量初始化为0。必要时,awk会将字符型变量转换为数值型变量,或者反向转换。对变量赋值要使用awk的赋值运算符(参见下表)。
赋值运算符
运算符 | 含义 | 等效表达式 |
---|---|---|
= | a=5 | a=5 |
+= | a=a+5 | a+=5 |
-= | a=a-5 | a-=5 |
*= | a=a*5 | a*=5 |
/= | a=a/5 | a/=5 |
%= | a=a%5 | a%=5 |
^= | a=a^5 | a^=5 |
最简单的赋值方式是求出表达式的结果,然后将其赋给变量。
范例
说明:awk将在第1个字段中扫描Tom。如果发现某一行符合条件,就将其第2个字段的值与第3个字段的值相乘,乘积赋值给用户定义的变量wage。由于乘法是算术运算,所以awk把wage的初始值设为0。
递增和递减运算符:如果要将操作数加1,可以使用递增运算符。表达式x++等价于x = x + 1。 类似地,递减运算符则使操作数减少1 。表达式x--等价于x=x-1 。当进行循环操作时,如果只需要递增或递减一个计数器,这种运算符就很有用。递增和递减运算符可以放在操作数的前面,如++x; 也可以置于操作数之后,如x++。用于赋值语句时,这两个运算符的位置不同可能会造成运算结果的差异。
上面这个例子中的++称为后递增运算符: y先被赋值为1,然后x才加1。这样,当所有运算做完后,y等于1 ,而x等于2。
上面这个例子中的++称为先递增运算符:先将x加1,然后才将值2赋给y。这样,在所有运算完成后,y等于2,x也等于2。
命令行上的用户自定义变量:可以在命令行上对变量赋值,然后将其传递给awk脚本。如果想对参数处理和ARGV有更多了解,请青参见“处理命令行参数”
范例
说明:用户自定义的变量month和year分别被赋值为4和2015。在awk脚本中可以使用这些变量,就好像它们是在脚本中生成的一样。注意,如果命令行中filename的位置在变量之前,这些变量将不能在BEGIN语句中使用(参见“awk的BEGIN与END模式”)。
字段变量:字段变量可以像用户自定义的变量一样使用,唯一的区别是它们引用了字段。新的字段可以通过赋值来创建。字段变量引用的字段如果没有值,则被赋值为空串。字段的值发生变化时, awk会以OFS的值作为字段分隔符重新计算$0变量的值。字段数目通常被限制在100 以内。
范例
说明:如果不存在第5个字段($5),awk将创建它并将表达式1000 * $3/$2的结果赋给它。如果存在第5个字段,就直接将表达式的结果赋给它,覆盖该字段原来的内容。
范例:
说明:如果第4个字段($4)匹配字符串CA,awk就将其重新赋值为California。双引号是必需的,如果没有这对双引号,字符串CA就会被当成一个初始值为空的用户自定义变量。
内量变量:内置变量的名字都是大写的。它们可以被用于表达式,也可以被重置。请参见下表中所列的内置变量。
内置变量
变量名 | 含义 |
---|---|
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件在ARGV 内的索引 |
ARGV | 命令行参数构成的数组 |
CONVFMT | 数字转换格式,默认为%.6g |
ENVIRON | 包含当前shell 环境变量值的数组 |
ERRNO | 当使用getline 函数进行读操作或者使用close 函数时,因重定向操作而产生的系统错误描述 |
FIELDWIDTHS | 在分隔固定宽度的列表时,使用空白而不是FS 进行分隔的字段宽度列表 |
FILENAME | 当前输入文件的文件名 |
FNR | 当前文件的记录数 |
FS | 输入字段分隔符,默认为空格 |
IGNORECASE | 在正则表达式和字符串匹配中不区分大小写 |
NF | 当前记录中的字段数 |
NR | 目前的记录数 |
OFMT | 数字的输出格式 |
OFS | 输出字段分隔符 |
ORS | 输出记录分隔符 |
RLENGTH | match 函数匹配到的字符串的长度 |
RS | 输入记录分隔符 |
RSTART | match 函数匹配到的字符串的偏移量 |
RT | 记录终结符,对于匹配字符或者用RS 指定的regex,awk将RT设置到输入文本 |
SUBSEP | 数组下标分隔符 |
参考文章:http://www.linuxawk.com/jiaocheng/189.html