变量
程序变量
无类型
BEGIN{ } { num = 100; # 先存个整数 print("num is: "num); num = 3.1415926; # 再来存个浮点数 print("num is: "num); num = "I'm string."; # 最后看看字符串 print("num is:"num); } END{ }
$echo "" |awk -f chapter_2_2-1.awk
num is: 100
num is: 3.14159
num is:I'm string.
awk变量就像所有其他脚本语言那样是无类型的,可以存储任意类型的值,并且可以随时进行改变,后面这点区别于支持类型推断的语言(如:C#,定义时虽然不用指定类型,但是一旦赋值后类型就固定了)。
无需定义
BEGIN{ } { print("var is:"var); # 我擦嘞,这直接就用上了 } END{ }
$echo ""|awk -f chapter_2_2-2.awk
var is:
变量随用随写,即使使用没初始化过的变量也不会报错。
全局性
BEGIN{ print("i in begin: "i); } { ++i; print("i in body: "i); } END{ print("i in end: "i); }
$cat chapter_2_2-3.awk |awk -f chapter_2_2-3.awk
i in begin:
i in body: 1
i in body: 2
i in body: 3
i in body: 4
i in body: 5
i in body: 6
i in body: 7
i in body: 8
i in body: 9
i in body: 10
i in end: 10
awk中所有的变量,无论是出现在BEGIN中的、BODY中的、END中的,抑或是后面要提到的function中的,通通都是全局的,也就是说只要变量名字相同,无论在任何地方做出了修改,其值都会延续到下一段执行的代码行上。这是变量使用中特别要注意的地方,否则就可能引发各种莫名其妙的问题。
传参变量
BEGIN{ print(x); print("i in begin: "i); } { ++i; print("i in body: "i); } END{ print("i in end: "i); }
$cat chapter_2_2-4.awk |awk -v x="I'm X" -v i=100 -f chapter_2_2-4.awk
I'm X
i in begin: 100
i in body: 101
i in body: 102
i in body: 103
i in body: 104
i in body: 105
i in body: 106
i in body: 107
i in body: 108
i in body: 109
i in body: 110
i in body: 111
i in end: 111
变量除可以在程序中进行赋值外也可以在命令行调用的时候进行,如上面例程,x和i的值都是以命令行参数传入,通过这种参数传入的方式就扩大了通过脚本程序的适用性。
系统变量
awk内置了一些可以获取额外信息的系统变量,以下是比较有用的一些:
变量名 | 说明 |
---|---|
$0 | 当前处理记录 |
$1-$n | 当前记录的n个字段 |
FS | 域分隔符 |
NF | 当前记录的域数目 |
NR | 已经处理的记录条数 |
RS | 记录分隔符 |
OFS | 输出字段分隔符 |
ORS | 输出记录分隔符 |
ARGC | 命令行参数个数 |
ARGV | 命令行参数数组 |
FILENAME | 当前输入文件名字 |
IGNRECASE | 记录为真代表忽略大小写匹配 |
ARGIND | 当前被处理文件的ARGV标志符 |
CONVFMT | 数字转换格式 %.6g |
ENVIRON | UNIX环境变量 |
ERRNO | UNIX系统错误消息 |
FIELDWIDTHS | 输入字段宽度的空白分隔字符串 |
FNR | 当前记录数 |
OFMT | 数字的输出格式 %.6g |
RSTART | 被匹配函数匹配的字符串首 |
RLENGTH | 被匹配函数匹配的字符串长度 |
SUBSEP | \034 |
PROCINFO | 当前运行程序进程信息数组 |