一、字符串函数
语法: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 0
5 root
6 /root
7 /bin/bash
1 root
2 x
3 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/awk
BEGIN{
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.awk
12
p-p24 p56-p66
24
p-p p56-p66
56
p-p p-p66
66
p-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/awk
BEGIN{
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
12
p-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 -9
2 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 -2
0.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()函数起始的种子。