ARGV[3] = [Four=4]
ARGV[4] = [file2]
ARGV[5] = [file3]
正如C/C++中,参数存储在数组项目0、1....、ARGC-1中,第0个项目是awk程序本身的名称。不过与-f 和 -v选项结合性的参数是不可使用的。同样的,任何命令行程序也不可使用:
$ awk 'BEGIN{for(k=0;k<ARGC;k++)
print "ARGV["k"] = ["ARGV[k]"]"}' a b c
ARGV[0] = [awk]
ARGV[1] = [a]
ARGV[2] = [b]
ARGV[3] = [c][/c][/c]
是否需要显示在程序名称里的目录路径,则看实际情况而定。awk程序可修改ARGC和ARGV,注意保持俩个的一致性。
awk一见到参数含有程序内容或是特殊--选项时,它会立即停止将参数解释为选项。任何接下来的看起来像是选项的参数,都必须由你的程序处理,并接着从ARGV中被删除或设置为空字符串。
awk提供访问内建数组ENVIRON中所有的环境变量:
$ awk 'BEGIN{ print ENVIRON["HOME"]; print ENVIRON["USER"]}'
/home/administrator
administrator
ENVIRON数组并无特别之处,可以随意修改删除。然而,POSIX要求子进程继承awk启动时生效的环境,而我们也发现,在现行实现下,并无法将对于ENVIRON数组的变更传递给子进程或者内建函数。特别地,这是指你无法通过对EVNIRON["LC_ALL"]的更改控制字符串函数,例如tolower(),在特定locale下的行为模式。因此你应将ENVIRON看成一个只读数组。如果要控制子进程的locale,则可通过在命令行字符串里设置适合的环境变量达成。如:
system("env LC_ALL=es_Es sort infile > outfile")#以Spanish的locale排序文件。
system()函数稍后说明。
模式与操作构成awk程序的核心。模式为真则进行操作。一般模式是正则表达式,就会被拿来与整个输入记录进行匹配,比如:
NF == 0 #选定空记录
NF > 3 #选定拥有三个字段以上的记录
NR < 5 #选定第一到第四条记录
$1 ~ /jones/ #选定字段1中有jones的记录
/[xX][mM][lL]/ #忽略大小写选定含xml的记录
awk在匹配功能上,还可以使用范围表达式,以逗点隔开的两个表达式。比如:
(FNR == 3) , (FNR == 10) #选定每个输入文件按里记录3到10
/<[Hh][Tt][Mm][Ll]>/ , /</[Hh][Tt][Mm][Ll]>/ #选定html文件里的主体
在BEGIN操作里,FILENAME、FNR、NF与NR初始都未定义;引用到他们时,会返回null。
通过模式的匹配,就要把为真记录的传给操作。给出一些实例:
#unix单词计数程序wc:
awk '{ C += length($0) + 1 ; W += NF } END { print NR, W, C}'
注意:模式/操作组并不需要以换行字符分隔,一般换行是为了阅读方便。我们也可以使用BEGIN{ C = W =0} 来初始化,但是awk具有默认的初始化保证。
#将原始数据值及他们的对数打印为单栏数据文件:
awk ' { print $1 , log($1) }' file(s)










