gensub()函数
对于
Thu Jan 12 14:36:25 2017 TCP from 192.168.222.128:9300 to 112.168.222.129:46471 44 bytes,
句子,把最后一个:变成空白
echo "Thu Jan 12 14:36:25 2017 TCP from 192.168.222.128:9300 to 112.168.222.129:46471 44 bytes," | awk '{print gensub (":"," ",4)}'
Thu Jan 12 14:36:25 2017 TCP from 192.168.222.128:9300 to 112.168.222.129 46471 44 bytes,
":"匹配冒号," "把冒号变成空白,4是这一句里面的第4个冒号,如果是g或者G的话,就是全局替换。gensub有4项目,最后一个可以省略,默认省略的是$0,如果写成这样awk '{print gensub (":"," ",4,$0)}',效果相同。
echo "Thu Jan 12 14:36:25 2017 TCP from 192.168.222.128:9300 to 112.168.222.129:46471 44 bytes," | awk '{print gensub (":"," ",2,$4)}'
14:36 25
这就是以空白为分隔符,对第4个字段(14:36:25)里面,替换第2个冒号为空白。
echo "aaa bbb" | awk '{print gensub(/(.+) (.+)/,"\\2 \\1","g")}'
bbb aaa
这就完成了替换。
echo "xaax xbx xxx:xaax xbx xxx" | awk -F: -vOFS=":" '{$2=gensub(/x([^x]+)x/,"\\
1YY",2,$2)}1'
xaax xbx xxx:xaax bYY xxx
这个比较复杂。冒号分列,$2对后半操作,2是针对/x([^x]+)x/匹配第二次,()是匹配的b,被\\
1调用,\要写2次,然后赋值给$2,最后的1相当于;print
gsub()函数
echo "Thu Jan 12 14:36:25 2017 TCP from 192.168.222.128:9300 to 112.168.222.129:46471 44 bytes," | awk 'gsub (":","!",$4)'
Thu Jan 12 14!36!25 2017 TCP from 192.168.222.128:9300 to 112.168.222.129:46471 44 bytes,
和gensub()函数很相近,但是如果按照它的写法,得出的结论却不一样
echo "Thu Jan 12 14:36:25 2017 TCP from 192.168.222.128:9300 to 112.168.222.129:46471 44 bytes," | awk '{print gsub (":","")}'
4
结果是4,等于是返回冒号出现的次数。
另外就是不能处理符号“.”,被当成任义的意思了,要加上两个\\
echo "Thu Jan 12 14:36:25 2017 TCP from 192.168.222.128:9300 to 112.168.222.129:46471 44 bytes," | awk 'gsub ("\\.","")'
Thu Jan 12 14:36:25 2017 TCP from 192168222128:9300 to 112168222129:46471 44 bytes,
sub()函数
echo "11111 22222 44444" | awk 'sub(/22222/,"33333")'
11111 33333 44444
echo "11111 22222 44444 22222" | awk 'sub(22222,33333)'
11111 33333 44444 22222
第二次出现的22222不被替换,只替换第一个。也可以指定域,sub(22222,33333,$0)