您的位置:首页 > 其它

awk的使用 第十三部分 awk的字符串和数学函数

2013-10-15 11:25 225 查看
   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 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()函数起始的种子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐