HOME 生活记录运维/编程
作者/来源:yixinu.com
栏目:运维/编程
日期:2012-04-08 15:05:01

字符串sub和gsub函数,sub 和 gsub 的区别是,前者只对匹配部分一次替换,后者为全部替换

example:


[root@bogon ~]# vim passwd 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin


[root@bogon ~]# gawk -F: '{sub(/root/,"fedora"); print $0}' passwd
fedora:x:0:0:root:/root:/bin/bash
fedora:x:0:0:root:/root:/bin/bash
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@bogon ~]# gawk -F: '{gsub(/root/,"fedora"); print $0}' passwd
fedora:x:0:0:fedora:/fedora:/bin/bash
fedora:x:0:0:fedora:/fedora:/bin/bash
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@bogon ~]# 



字符串长度length函数


    格式:gawk '{print length($1)}' filename

example:


[root@bogon ~]# gawk -F: '{print $1,length($1)}' passwd 
root 4
root 4
gopher 6
ftp 3
[root@bogon ~]# 



substr函数,返回字符串从指定位置开始的子字符串


    gawk '{print substr($1,7,length)}' filename

example:


[root@bogon ~]# gawk -F: '{print substr($0,4,10)}' passwd 
t:x:0:0:ro
t:x:0:0:ro
her:x:13:3
[root@bogon ~]# 

match函数:根据正则表达式返回在字符串中出现的位置,未出现,返回0


    match函数中的变量:RSTART 子字符串出现的位置、RLENGTH子字符串的长度,这两个变量可以 提供给substr提取字符串

example:


[root@bogon ~]# cat test
Tom 234 05/03/2008 685
Mary 451 06/04/2008 932
Bill 127 09/10/2009 3456
[root@bogon ~]# gawk '{match($3,/[12][0-9][0-9][0-9]/);print $3,substr($3,RSTART,RLENGTH)}' test
05/03/2008 2008
06/04/2008 2008
09/10/2009 2009
[root@bogon ~]# 



split 函数 :用来将字符串切割成数组

    splitb函数切割的数组下标从1开始,0永远为空

example:


[root@bogon ~]# cat awk9.awk 
#!/bin/awk
{
    split($0,data,":");
}
END{
    i=1;
    while(i<=NF){
        print data[i];
      i++;
    }
}
[root@bogon ~]# gawk -F: -f awk9.awk passwd 
ftp
x
14
50
FTP User
/var/ftp
/sbin/nologin
[root@bogon ~]# 



模拟二维数组输出passwd


    awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,array[2,4] = 1这样的访问是允许的。awk使用一个特殊的字符串SUBSEP (34)作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2344。

example:


[root@bogon ~]# cat passwd 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@bogon ~]# cat awk8.awk 
#!/bin/awk
{
    for(i=0;i<NF;i++){
        data[NR-1,i]=$i;
    }
}
END{
    for(i=0;i<NR;i++){
        for(j=0;j<NF;j++){
          print data[i,j]
      }
      print "n";
    }
}
[root@bogon ~]# 



int函数


    去掉小数点后面的部分,留下整数部分

example:


[root@bogon ~]# gawk 'END{print (31/3)}' test
10.3333
[root@bogon ~]# gawk 'END{print int(31/3)}' test
10
[root@bogon ~]# 



生成随机数

    rand函数生成一个大于或等于0,小于1的浮点数

    srand函数,以当前时刻为rand函数生成一个种子

example:

    如果不设置srand,则每次生成的随机数都一样


[root@bogon ~]# gawk 'END{print rand()}' test
0.237788
[root@bogon ~]# gawk 'END{print rand()}' test
0.237788
[root@bogon ~]# gawk 'END{print rand()}' test
0.237788
[root@bogon ~]# gawk 'BEGIN{srand()} END{print rand()}' test
0.935553
[root@bogon ~]# gawk 'BEGIN{srand()} END{print rand()}' test
0.204524
[root@bogon ~]# gawk 'BEGIN{srand()} END{print rand()}' test
0.881818
[root@bogon ~]# 



综合实验一



[root@bogon ~]# cat test2 
Tom   2010-04-09        car  6  6000
Mary  2010-05-07        car  1  1000
Tom   2010-05-20        bike 15 1500
Mary  2010-05-22        car  2  2000
Tom   2010-06-17        car  1  1000
[root@bogon ~]# gawk -f awk10 test2
Tom :05 1500
Mary :05 3000
[root@bogon ~]# cat awk10
#!/bin/awk
{
    split($2,DATE,"-");
    if(DATE[2]==5){
      name[$1]+=$5;
    }
}
END{
    for(data in name){
      print data,":05",name[data];
    }
}
[root@bogon ~]# 

综合实验二


[root@bogon ~]# cat test3
Tom 04/09/2010 car 6 6000
Mary 05/07/2010 car 1 1000
Tom 05/20/2010 bike 15 1500
Mary 05/22/2010 car 2 2000
Tom 06/17/2010 car 1 1000
[root@bogon ~]# gawk '{OFS="t";split($2,data,"/"); print $1,data[3]"-"data[1]"-"data[2],$3,$4,$5}' test3
Tom   2010-04-09        car  6  6000
Mary  2010-05-07        car  1  1000
Tom   2010-05-20        bike 15 1500
Mary  2010-05-22        car  2  2000
Tom   2010-06-17        car  1  1000
[root@bogon ~]# 

分享到:

Copyright © 2013-2014 yixinu.com 湘ICP备14004402号

QQ:316686606  Email: 316686606@qq.com