字符串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 ~]#