Linux高级文本处理之gawk printf命令与函数(3)

实例4:

[root@bash ~]# cat sub.awk BEGIN { state="CA is California" sub("C[Aa]","KA",state); print state; } [root@bash ~]# awk -f sub.awk KA is California

gsub函数:

gsub([r,s,[t]]) 对t字符串进行搜索r表示的模式匹配的内容(可使用正则匹配),并全部替换为s。

实例1:

[root@bash ~]# echo "2008:08:08:08 08:08:08" | awk 'gsub(/:/,"",$1)' 2008080808 08:08:08

split函数:

split(s,array,[r]) 以r为分割符切割字符s,并将切割后的结果存至array表示的数组中第一个索引值为1,第二个索引值为2,…。

实例1:

[root@bash ~]# echo "192.168.1.1:80"|awk ' >{split($1,ip,":"); >print ip[1],"----",ip[2]}'                        192.168.1.1 ---- 80

实例2:

[root@bash ~]# netstat -tan | awk ' >/^tcp\>/{split($5,ip,":"); >count[ip[1]]++}  #将一个数组的值作为另一个数组的索引并自加通常用来计算重复次数 >END{for (i in count){print i,count[i]}}' 116.211.167.193 3 0.0.0.0 4 192.168.1.116 1

实例3:

[root@bash ~]# cat items-sold1.txt    101:2,10,5,8,10,12 102:0,1,4,3,0,2 103:10,6,11,20,5,13 104:2,3,4,0,6,5 105:10,2,5,7,12,6 [root@bash ~]# cat split.awk BEGIN { FS=":" } { split($2,quantity,","); total=0; for(x in quantity) total=total+quantity[x]; print "Item",$1,":",total,"quantities sold"; } [root@bash ~]# awk -f split.awk items-sold1.txt Item 101 : 47 quantities sold Item 102 : 10 quantities sold Item 103 : 65 quantities sold Item 104 : 20 quantities sold Item 105 : 42 quantities sold

substr 函数

语法:

substr(input-string,location,length)

substr 函数从字符串中提取指定的部分(子串),上面语法中:

input-string:包含子串的字符串

location:子串的开始位置

length:从 location 开始起,出去的字符串的总长度。这个选项是可选的,如果不指

定长度,那么从 location 开始一直取到字符串的结尾

实例1:从字符串的第 5 个字符开始,取到字符串结尾并打印出来

[root@localhost ~]# cat items.txt  101,HD Camcorder,Video,210,10 102,Refrigerator,Appliance,850,2 103,MP3 Player,Audio,270,15 104,Tennis Racket,Sports,190,20 105,Laser Printer,Office,475,5 [root@localhost ~]# awk '{ print substr($0,5) }' items.txt HD Camcorder,Video,210,10 Refrigerator,Appliance,850,2 MP3 Player,Audio,270,15 Tennis Racket,Sports,190,20 Laser Printer,Office,475,5

实例2:从第 2 个字段的第 1 个字符起,打印 5 个字符

[root@localhost ~]# awk -F"," '{ print substr($2,1,5) }' items.txt HD Ca Refri MP3 P Tenni Laser

调用shell函数

双向管道 |&

awk 可以使用”|&”和外部进程通信,这个过程是双向的。

实例1:

[root@localhost ~]# cat doub.awk  BEGIN {     command = "sed 's/Awk/Sed and Awk/'"     print "Awk is Great!" |& command     close(command,"to");  #awk中同时只能存在一个管道     command |& getline tmp     print tmp;     close(command); } [root@localhost ~]# awk -f doub.awk  Sed and Awk is Great!

说明:”|&”表示这里是双向管道。 ”|&”右边命令的输入来自左边命令的输出。close(command,"to") – 一旦命令执行完成,应该关闭”to”进程。 command |& getline tmp –既然命令已经执行完成,就要用 getline 获取其输出。前面命令的输出会被存在变量”tmp”中。close(command) 最后,关闭命令。

system系统函数

执行系统命令时,可以传递任意的字符串作为命令的参数,它会被当做操作系统命令准确第执行,并返回结果(这和双向管道有所不同)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14413.html