在awk中,变量不需要定义就可以直接使用,变量类型可以是数字或字符串,由awk根据上下文推导,不用指定
变量名可以包括字母、数字和下划线,但不能以数字开头。
赋值格式:Variable = expression
变量被设置后,就变成与等号右边那个表达式相同的类型。
未经初始化的变量的值是0或者“”,具体是哪个取决于它们被使用时的上下文。
将一个字符串强制转换为数字,方法为: name+0
将数字转换成字符串的方法是: number “”
赋值运算符: =,+=,-=,*=,/=,%=,^=
递增递减运算符,也分为前置和后置两种,遵循的规则与C语言中一样
awk可以在命令行中给变量赋值,然后将这个变量传输给awk脚本。如$ awk -F: -f awkscript month=4
year=2004 filename,上式的month和year都是自定义变量,分别被赋值为4和2004。在awk脚本中,这些变量使用
起来就象是在脚本中建立的一样。注意,如果命令行中filename的位置在变量之前,那么在BEGIN语句中的变量就不能被
使用(参见后面的BEGIN模式)。
-v选项,awk的-v选项允许在BEGIN语句中,处理命令行变量。从命令行传递的每一个变量前面都必须加-v选项
字段变量也可被赋值和修改。新的字段可以通过赋值来创建。字段变量引用的字段如果没有值,则被赋值为空串(即
如果只有4个字段,但是对$6复制,那么不存在的$5被赋值为空串)。字段的值发生变化时,awk会以OFS的值作为字段间
隔符重新计算$0的值。字段数目通常在100以内。如$ awk '{$2 = 100 + $1; print }' test,上式表示,如果第二
个域不存在,awk将计算表达式100加$1的值,并将其赋值给$2,如果第二个域存在,则用表达式的值覆盖$2原来的值。
内建变量
$n 当前记录的第n个字段,字段间由FS分隔。
$0 完整的输入记录。
ARGC 命令行参数的数目。
ARGIND 命令行中当前文件的位置(从0开始算)。
ARGV 包含命令行参数的数组。
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组。
ERRNO 最后一个系统错误的描述。
FIELDWIDTHS 字段宽度列表(用空格键分隔)。
FILENAME 当前文件名。
FNR 同NR,但相对于当前文件。
FS 字段分隔符(默认是任何空格)。
IGNORECASE 如果为真(即非0值),则进行忽略大小写的匹配。
NF 当前记录中的字段数。
NR 当前记录数。
OFMT 数字的输出格式(默认值是%.6g)。
OFS 输出字段分隔符(默认值是一个空格)。
ORS 输出记录分隔符(默认值是一个换行符)。
RLENGTH 由match函数所匹配的字符串的长度。
RS 记录分隔符(默认是一个换行符)。
RSTART 由match函数所匹配的字符串的第一个位置。
SUBSEP 数组下标分隔符(默认值是\034)。
15.BEGIN模式
BEGIN模式后面跟一个操作块。awk必须在对输入文件进行任何处理之前,先执行该操作块。常被用于修改内置变量
的值,为用户自定义变量赋初值和打印输出的页眉或者标题。。
例8:
$ awk 'BEGIN{FS=":"; OFS="\t"; ORS="\n\n"}{print $1,$2,$3} filename。上式表示,在处理输入
文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设
置为两个换行符。$ awk 'BEGIN{print "TITLE TEST"}只打印标题。
编写awk脚本时,可以先测试好BEGIN块操作,再写程序的其他部分。
16.END模式
END模式不匹配任何输入行,而是执行任何与之关联的操作。Awk处理完所有输入行之后才处理END模式。
例9:
$ awk 'END{print "The number of records is" NR}' test,上式将打印所有被处理的记录数。
17.重定向和管道
awk可使用shell的重定向符进行重定向输出
输入重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输
入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果
到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。
例10:
$ awk 'BEGIN{ "date" | getline d; print d}' filename
执行linux的date命令,并通过管道输出给getline,然后再把输出赋值给自定义变量d,并打印它。
$ awk 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}' filename
执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给d,split函
数把变量d转化成数组mon,然后打印数组mon的第二个元素。
$ awk 'BEGIN{while( "ls" | getline) print}'
命令ls的输出传递给getline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有
输入文件,因为 BEGIN块在打开输入文件前执行,所以可以忽略输入文件。
$ awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'
awk将逐行读取文件/etc/passwd的内容,在到达文件末尾前,计数器lc一直增加,当到末尾时,打印lc的值。
注意,如果文件不存在,getline返回-1,如果到达文件的末尾就返回0,如果读到一行,就返回1,所以命令
while (getline < "/etc/passwd")在文件不存在的情况下将陷入无限循环,因为返回-1表示逻辑真。 如果在awk程序中打开了管道,就必须先关闭它才能打开另一个管道。管道符右边的命令被括在双引号之间。每次只 能打开一个管道。如果打算再次在awk程序中使用某个文件或管道进行读写,则可能要先关闭程序,因为其中的管道会保持打 开状态直至脚本运行结束。注意:管道一旦被打开,就会保持打开状态直至awk退出。END块中的语句也会受到管道影响。通 过close()可关闭管道 例11: (脚本) { print $1,$2,$3 | “sort -r +1 -2 +0 -1” } END{ close(“sort -r +1 -2 +0 -1”) }
awk内置函数system以Linux系统命令作为参数,执行该命令并将命令的退出状态返回给awk程序。作为参数的
命令必须加双引号。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code