awk 的內建函数(Built-in Functions)
一、字符串函数 语法:index( 原字符串,寻找的子字符串): 解释:若原字符串中含有欲找寻的子字符串,则返回该子字符串在原字符串中第一次出现的位置,如果没有出现该子字符串则返回0。 例如执行: [root@myfreelinux pub]# awk ‘BEGIN{print index(“0411-8888-9999″,”-8″)}’ 5 是返回值,实际上检索到“-8”时,“-”在第五位,所以返回值就是5了。
语法:length(字串) 解释:返回该字串的长度。 例如执行:[root@myfreelinux pub]# awk ‘BEGIN{print length(“0411-8888-9999″)}’14 是返回值 语法:match( 原字串,寻找对比的正则表达式) 解释:awk会在原字串中寻找复合正则表达式的子字符串,如果复合正则表达式的字符串有多个,以原字符串中最左侧的子字符串为准。 awk找到该字符串后会根据字符串设定以下awk内部变量的值,比如RSTART和RLENGTH RSTART=符合条件的子字符串在原字符串中的位置,如果=0表示没有找到合条件的子字符串。 RLENGTH = 符合条件的子字符串长度,如果=-1表示没有找到符合条件的子字符串。 比如看一下两个例子:[root@myfreelinux pub]# awk ‘BEGIN{match(“banana”,”an”);print RSTART,RLENGTH}’2 2[root@myfreelinux pub]# awk ‘BEGIN{match(“banana”,/(an)+/);print RSTART,RLENGTH}’2 4可以看到这两条语句执行的结果不一样,因为第一条的正则表达式只是寻找“an”,而第二条是寻找”an”的多个多个重复组合,所以有两组”an”,长度是4。
语法:split( 原字符串,数组名称,分隔字符) 解释: awk将根据指定的分隔字符(field separator)来分隔原字符串,将原字符串分割成一个个的域(field),并以指定的数组保存各个域的值。 例如:[root@myfreelinux pub]# awk ‘BEGIN{str=”root:x:0:0:root:/root:/bin/bash”;split(str,array,”:”);for(one in array) print one,array[one];}’4 05 root6 /root7 /bin/bash1 root2 x3 0
语法:sprintf(格式字符串,项1,项2,….) 解释:该函数的用法与awk或C语言的输出函数printf()相似,不同的是sprintf()会要求打印出的结果当成一个字符串返回。一般常用sprintf()来改变资料格式。例如:x为一数值,若欲将其变成一个含二位小数的数值,可执行如下指令:[root@myfreelinux pub]# awk ‘BEGIN{x=2;x=sprintf(“%.2f”,x);print x}’,执行结果是2.00
语法:sub( 比对用的正则表达式,新字符串,原字符串) 解释:sub( )将原字符串中第一个(最左边)符合正则表达式的子字符串替换为新字符串。第二个参数“新字符串”中可用”&”来表示“符合条件的字符串”。承上例,执行下列指令:[root@myfreelinux pub]# awk ‘BEGIN{A=”a6b12anan212.456an12″;sub(/(an)+[0-9]*/,”[&]“,A);print A}’a6b12[anan212].456an12[root@myfreelinux pub]# awk ‘BEGIN{A=”a6b12anan212.456an12″;sub(/(an)+[0-9]*/,”|&|”,A);print A}’a6b12|anan212|.456an12[root@myfreelinux pub]# awk ‘BEGIN{A=”a6b12anan212.456an12″;sub(/(an)+[0-9]*/,”",A);print A}’a6b12.456an12[root@myfreelinux pub]# awk ‘BEGIN{A=”a6b12anan212.456an12″;sub(/(an)+[0-9]*/,”999″,A);print A}’a6b12999.456an12 由以上四个例子可以看出,&表示匹配的字符串,对于新字符串,需要用双引号引起来,比如“999”,那么匹配的字符串就会替换成999,而如果双引号内没有任何字符的时候,就是将匹配的字符串给删除。 sub() 与match()搭配使用,可依次取出原字符串中符合指定条件的所有子字符串。 例如执行下列程式:[root@myfreelinux pub]# vi submatch.awk#!/bin/awkBEGIN{data=”p12-p24 p56-p66″;while(match(data,/[0-9]+/)>0){ print substr(data,RSTART,RLENGTH);#RSTART表示匹配的位置,RLENGTH表示匹配的长度,这一行是打印匹配的数字sub(/[0-9]+/,”",data);#将匹配的数字用空字符串代替print data;} #匹配的数字打印后,用空字符串代替,原data字符串内容发生变化}执行并查看运行结果如下:[root@myfreelinux pub]# awk -f submatch.awk12p-p24 p56-p6624p-p p56-p6656p-p p-p6666p-p p-p awk ‘ BEGIN { data = “p12-P34 P56-p61″ sub( )中第三个参数(原字符串)如果没有指定,默认是$0。比如可用sub( /[9-0]+/,”digital” ) 表示sub(/[0-9]+/,”digital”, $0 )
语法:gsub(正则表达式,新字符串,原字符串) 解释: 这个函数与sub()一样,是进行字符串取代的函数。不同点是gsub()会取代所有合条件的子字符串,而sub函数只会取代同一行中第一个符合条件的字符串,gsub()会返回被取代的子字符串个数。 同样是一个程序,只将sub函数替换为gsub函数,再来看一下执行效果:[root@myfreelinux pub]# vi submatch.awk#!/bin/awkBEGIN{data=”p12-p24 p56-p66″;while(match(data,/[0-9]+/)>0){ print substr(data,RSTART,RLENGTH);gsub(/[0-9]+/,”",data);#其他的都不变,只将sub函数替换为gsub函数,输出结果变化很大print data;}}[root@myfreelinux pub]# awk -f submatch.awk 12p-p p-p #输出结果只有两行,这就是sub和gsub的不同点 通过上面这个例子,对比一下sub中的例子,就能明显的区分出sub和gsub函数的区别。
语法:substr( 字符串,起始位置 [,长度] ) 解释: 返回从起始位置起,指定长度的子字符串,如果没有指定长度,则返回起始位置到字符串末尾的子字符串。 看下例:[root@myfreelinux pub]# awk ‘BEGIN{A=”I love todays life”;print substr(A,3);}’love todays life[root@myfreelinux pub]# awk ‘BEGIN{A=”I love todays life”;print substr(A,3,4);}’love注意空格也算字符。
(二)、 数学函数 语法:int(x) 解释:返回x的整数部分,去掉小数。看下例: [root@myfreelinux pub]# awk ‘BEGIN{a=5.5;b=-5.5;print int(a), int(b);}’ #注意int函数是向零取整,而不是四舍五入5 -5
语法:sqrt(x) 解释:返回x的平方根。 看下例:[root@myfreelinux pub]# awk ‘BEGIN{a=4;b=-9;print sqrt(a),sqrt(b);}’awk: warning: sqrt: called with negative argument -92 nan通过上例看以看到,如果是一个负数,比如-9,系统会提示非法参数(negative argument),并输出nan。
语法:exp(x) 解释:将返回e 的x次方。 看下例:[root@myfreelinux pub]# awk ‘BEGIN{print exp(1),exp(2);}’2.71828 7.38906
语法:log(x) 解释:返回x以e为底的对数值。看下例:[root@myfreelinux pub]# awk ‘BEGIN{print log(2.71828),log(-2);}’awk: warning: log: received negative argument -20.999999 nan 可以看出,和执行sqrt(x)一样,x同样不能是负数,否则提示参数错误,并返回nan值。
语法:sin(x) 解释:x 须以弧度为单位,sin(x)将返回x的sin函数值。 语法:cos(x) 解释:x 须以弧度为单位,cos(x)将返回x的cos函数值 语法:atan2(y,x) 解释:返回y/x 的tan反函数之值,返回值系以弧度为单位。
语法:rand() 解释:返回介于0与1之间的(近似)随机数值,0 <rand()<1。除非自己指定rand()函数起始的种子,否则每次执行awk程序时,rand()函数都将使用同一个內定的种子,来产生随机数。
语法:srand([x]) 解释:指定以x为rand( )函数起始的种子。如果省略了x,则awk会以执行时的日期与时间为rand()函数起始的种子。