用户自定义变量 内置变量

来源:互联网 发布:网络剧 余罪 安嘉璐 编辑:程序博客网 时间:2024/05/22 17:03

用户自定义变量的变量名可以由字母、数字和下划线组成,但是不能以数字开头。awk的变量不用声明其类型,awk可以从变量在表达式中的上下文推导出它的数据类型。如果变量未被初始化,awk会将字符串变量初始化为空串,将数值变量初始化为0。必要时,awk会将字符型变量转换为数值型变量,或者反向转换。对变量赋值要使用awk的赋值运算符(参见下表)。
赋值运算符

运算符含义等效表达式=a=5a=5+=a=a+5a+=5-=a=a-5a-=5*=a=a*5a*=5/=a=a/5a/=5%=a=a%5a%=5^=a=a^5a^=5

最简单的赋值方式是求出表达式的结果,然后将其赋给变量。
范例

$ awk '$1 ~ /Tom/{wage = $2 * $3;print wage}' filename

说明:awk将在第1个字段中扫描Tom。如果发现某一行符合条件,就将其第2个字段的值与第3个字段的值相乘,乘积赋值给用户定义的变量wage。由于乘法是算术运算,所以awk把wage的初始值设为0。

递增和递减运算符:如果要将操作数加1,可以使用递增运算符。表达式x++等价于x = x + 1。 类似地,递减运算符则使操作数减少1 。表达式x--等价于x=x-1 。当进行循环操作时,如果只需要递增或递减一个计数器,这种运算符就很有用。递增和递减运算符可以放在操作数的前面,如++x; 也可以置于操作数之后,如x++。用于赋值语句时,这两个运算符的位置不同可能会造成运算结果的差异。

{= 1;y = x++;print x,y}

上面这个例子中的++称为后递增运算符: y先被赋值为1,然后x才加1。这样,当所有运算做完后,y等于1 ,而x等于2。

{= 1;y = ++x;print x,y}

上面这个例子中的++称为先递增运算符:先将x加1,然后才将值2赋给y。这样,在所有运算完成后,y等于2,x也等于2。

命令行上的用户自定义变量:可以在命令行上对变量赋值,然后将其传递给awk脚本。如果想对参数处理和ARGV有更多了解,请青参见“处理命令行参数”
范例

awk -F-f awkscript month=4 year=2015 filename

说明:用户自定义的变量month和year分别被赋值为4和2015。在awk脚本中可以使用这些变量,就好像它们是在脚本中生成的一样。注意,如果命令行中filename的位置在变量之前,这些变量将不能在BEGIN语句中使用(参见“awk的BEGIN与END模式”)。

字段变量:字段变量可以像用户自定义的变量一样使用,唯一的区别是它们引用了字段。新的字段可以通过赋值来创建。字段变量引用的字段如果没有值,则被赋值为空串。字段的值发生变化时, awk会以OFS的值作为字段分隔符重新计算$0变量的值。字段数目通常被限制在100 以内。
范例

$ awk '{$5 = 1000 * $3 / $2; print}' filename

说明:如果不存在第5个字段($5),awk将创建它并将表达式1000 * $3/$2的结果赋给它。如果存在第5个字段,就直接将表达式的结果赋给它,覆盖该字段原来的内容。

范例:

$ awk '$4 == "CA" {$4 = "California";print}' filename

说明:如果第4个字段($4)匹配字符串CA,awk就将其重新赋值为California。双引号是必需的,如果没有这对双引号,字符串CA就会被当成一个初始值为空的用户自定义变量。

内量变量:内置变量的名字都是大写的。它们可以被用于表达式,也可以被重置。请参见下表中所列的内置变量。
内置变量

变量名含义ARGC命令行参数的数目ARGIND命令行中当前文件在ARGV 内的索引ARGV命令行参数构成的数组CONVFMT数字转换格式,默认为%.6gENVIRON包含当前shell 环境变量值的数组ERRNO当使用getline 函数进行读操作或者使用close 函数时,因重定向操作而产生的系统错误描述FIELDWIDTHS在分隔固定宽度的列表时,使用空白而不是FS 进行分隔的字段宽度列表FILENAME当前输入文件的文件名FNR当前文件的记录数FS输入字段分隔符,默认为空格IGNORECASE在正则表达式和字符串匹配中不区分大小写NF当前记录中的字段数NR目前的记录数OFMT数字的输出格式OFS输出字段分隔符ORS输出记录分隔符RLENGTHmatch 函数匹配到的字符串的长度RS输入记录分隔符RSTARTmatch 函数匹配到的字符串的偏移量RT记录终结符,对于匹配字符或者用RS 指定的regex,awk将RT设置到输入文本SUBSEP数组下标分隔符

参考文章:http://www.linuxawk.com/jiaocheng/189.html

0 0