变量

程序变量

无类型

chapter_2_2-1.awk

  1. BEGIN{
  2. }
  3. {
  4. num = 100; # 先存个整数
  5. print("num is: "num);
  6. num = 3.1415926; # 再来存个浮点数
  7. print("num is: "num);
  8. num = "I'm string."; # 最后看看字符串
  9. print("num is:"num);
  10. }
  11. END{
  12. }

$echo "" |awk -f chapter_2_2-1.awk
num is: 100
num is: 3.14159
num is:I'm string.

awk变量就像所有其他脚本语言那样是无类型的,可以存储任意类型的值,并且可以随时进行改变,后面这点区别于支持类型推断的语言(如:C#,定义时虽然不用指定类型,但是一旦赋值后类型就固定了)。

无需定义

chapter_2_2-2.awk

  1. BEGIN{
  2. }
  3. {
  4. print("var is:"var); # 我擦嘞,这直接就用上了
  5. }
  6. END{
  7. }

$echo ""|awk -f chapter_2_2-2.awk
var is:

变量随用随写,即使使用没初始化过的变量也不会报错。

全局性

chapter_2_2-3.awk

  1. BEGIN{
  2. print("i in begin: "i);
  3. }
  4. {
  5. ++i;
  6. print("i in body: "i);
  7. }
  8. END{
  9. print("i in end: "i);
  10. }

$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中的,通通都是全局的,也就是说只要变量名字相同,无论在任何地方做出了修改,其值都会延续到下一段执行的代码行上。这是变量使用中特别要注意的地方,否则就可能引发各种莫名其妙的问题。

传参变量

chapter_2_2-4.awk

  1. BEGIN{
  2. print(x);
  3. print("i in begin: "i);
  4. }
  5. {
  6. ++i;
  7. print("i in body: "i);
  8. }
  9. END{
  10. print("i in end: "i);
  11. }

$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
ENVIRONUNIX环境变量
ERRNOUNIX系统错误消息
FIELDWIDTHS输入字段宽度的空白分隔字符串
FNR当前记录数
OFMT数字的输出格式 %.6g
RSTART被匹配函数匹配的字符串首
RLENGTH被匹配函数匹配的字符串长度
SUBSEP\034
PROCINFO当前运行程序进程信息数组

results matching ""

    No results matching ""