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

    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()函数起始的种子。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值