在linux/unix中大部分的应用程序都允许用户在命令之后增加一些参数,在执行awk 程序是,也可以在awk程序后增加一些参数,这些参数一般是用来指定数据文件的文件名。这里,我们看一下awk程序是如何使用这些参数的。 建立文件analyse.awk,内容如下:root@myfreelinux pub]# cat analyse.awk#!/bin/bashawk ‘BEGIN{for(i=0;i<ARGC;i++) print ARGV[i];# 依次印出awk所记录的参数}’ $* 执行结果如下:[root@myfreelinux pub]# bash analyse.awk first-arg second-argawkfirst-argsecond-arg 解释说明:ARGC,ARGV[ ]是awk的内建变量。 ARGC :是一整数,代表命令行上除了选项-v, -f 及其对应的参数之外所有参数的个数。 ARGV[ ] 是一字符串数组,ARGV[0],ARGV[1],。。。ARGV[ARGC-1]分别代表命令行上相对应的参数。 比如在这里执行的命令[root@myfreelinux pub]# bash analyse.awk first-arg second-arg,ARGC的值是3,ARGV[0]是”awk”,ARGV[1]的值为”first-arg”, ARGV[2]的值是”second-arg”。 再比如#awk -vx=21-f program fir-data sec-data和#awk ‘{ print $1 ,$2 }’ fir-data sec-data 这两条ARGC 值都是3,ARGV[0]是”awk”,ARGV[1]是”fir-data”,ARGV[2]是”sec-data”,命令行上的”-f program”,” -vx=21″,程序部分’{ print $1, $2}’ 都不会被列入ARGC和ARGV[ ]中。 awk 利用ARGC 来判断要打开的数据文件的个数,但是用户可以强行更改ARGC的值;比如将ARGC的值被用户设置为1,那么awk将被蒙骗,误以为命令行上没有数据文件文件, 所以不会以 ARGV[1],ARGV[2]等作为文件名来打开文件并读取数据;但是在程序中可以使用ARGV[1],ARGV[2]等变量来取得命令行上数据文件的数据。
现在有一个awk程序内容如下:[root@myfreelinux pub]# cat test1.awk#!/bin/awk -fBEGIN{for(i=0;i<ARGC;i++) print ARGV[i];}执行以上程序的结果如下:[root@myfreelinux pub]# awk -f test1.awk arrive.dat today_result1awkarrive.dattoday_result1 加入将test1.awk的内容更改成test2.awk的内容如下: [root@myfreelinux pub]# cat test2.awk#!/bin/awk -fBEGIN{number=ARGC; #用number 记住实际的参数个数ARGC=2;#设置ARGC=2,awk将以为只有一个资料文件for(i=0;i<ARGC;i++) print ARGV[i];}执行并查看运行结果:[root@myfreelinux pub]# awk -f test2.awk arrive.dat today_result1 today_result2awkarrive.dat这个时候会发现,虽然同样ARGC=3,但是人为的设置ARGC=2,后,awk在执行的时候,只认为有一个参数arrive.dat。将test2.awk修改成以下内容:[root@myfreelinux pub]# cat test3.awk#!/bin/awk -fBEGIN{number=ARGC;ARGC=2;for(i=0;i<ARGC;i++) print ARGV[i];for(i=ARGC;i<number;i++) print ARGV[i];}运行并查看运行结果如下:[root@myfreelinux pub]# awk -f test3.awk arrive.dat today_result1 today_result2awkarrive.dattoday_result1显然,通过修改ARGC可以修改awk能够识别的参数的个数,但是实际存在的ARGV的内容,仍然可以访问的。比如在这里ARGC设置为2后,awk只能打开ARGV[1]=arrive.dat,但是我们可以使用ARGV[2],ARGV[3]取得命令行上的参数today_result1,today_result2。