用户自定义变量 内置变量

用户自定义变量的变量名可以由字母、数字和下划线组成,但是不能以数字开头。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/{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 数字转换格式,默认为%.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值