Linux中gsub函数,Linux中awk下gsub函数⽤法
⼀。遇到的问题:
问题:echo "a b c 2011-11-22 a:d" | awk ‘$4=gsub(/-/,"",$4)‘为啥 输出后 2011-11-22 变成 2 了?
罗马阳光解答:
gsub(/-/,"",$4)的值是2【在赋值的情况下是这样的~】,你将2赋值给$4 ,gsub返回的是替换的次数。
如下是测试结果:
[[email protected] ~]# echo "a b c 2011-11-22 a:d" | awk ‘$4=gsub(/-/,"",$4)‘
a b c 2 a:d
黄义达微光看另⼀种情况,只是替换的话~
[[email protected] config]# echo "a b c 2011-11-22 a:d" | awk ‘gsub(/-/,"",$4)‘
a b c 20111122 a:d
[[email protected] config]# echo "a b c 2011-11-22 a:d" | awk ‘gsub(/-/,"_",$4)‘
a b c 2011_11_22 a:d
⼆。实例详解
下⾯我们来总结⼀下这个gsub的⽤法:
有⼀个⽂本⽂件st的内容如下:
0001|20081223efskjfdj|EREADFASDLKJCV
0002|20081208djfksdaa|JDKFJALSDJFsddf
0003|20081208efskjfdj|EREADFASDLKJCV
0004|20081211djfksdaa1234|JDKFJALSDJFsddf
以‘|‘为分隔, 现要将第⼆个域字母前的数字去掉,其他地⽅都不变, 输出为:
0001|efskjfdj|EREADFASDLKJCV
在人间
0002|djfksdaa|JDKFJALSDJFsddf
0003|efskjfdj|EREADFASDLKJCV华为下载免费铃声
0004|djfksdaa1234|JDKFJALSDJFsddf
解法:
awk -F ‘|‘  ‘{sub(/[0-9]+/,"",$2);print $0}‘ st
三。sub和gsub的区别
sub匹配第⼀次出现的符合模式的字符串,相当于 sed ‘s//‘
gsub匹配所有的符合模式的字符串,相当于 sed ‘s//g‘
awk的sub函数⽤法:
sub函数匹配指定域/记录中最⼤、最靠左边的⼦字符串的正则表达式,并⽤替换字符串替换这些字符串。如果没有指定⽬标字符串就默认使⽤整个记录,替换只发⽣在第⼀次匹配的时候。
实例:
$ awk ‘{ sub(/test/, "mytest"); print }‘ testfile芒果tv 刘露
$ awk ‘{ sub(/test/, "mytest", $1); print }‘ testfile
第⼀个例⼦在整个记录中匹配,替换只发⽣在第⼀次匹配发⽣的时候。
第⼆个例⼦在整个记录的第⼀个域中进⾏匹配,替换只发⽣在第⼀次匹配发⽣的时候
super junior mamacitagsub函数作⽤如sub,但它在整个⽂档中进⾏匹配。
实例:
$ awk ‘{ gsub(/test/, "mytest"); print }‘ testfile
$ awk ‘{ gsub(/test/, "mytest", $1); print }‘ testfile
第⼀个例⼦在整个⽂档中匹配test,匹配的都被替换成mytest。
第⼆个例⼦在整个⽂档的第⼀个域中匹配,所有匹配的都被替换成mytest。
只有当记录中的域有改变的时候 ,指定0FS变量才有⽤, 如果记录中的域⽆变化, 指定OFS产⽣不了实际效果。awk -F‘|‘ -v OFS=‘|‘ ‘{ gsub(/[0-9]/, "", $3); print $0; }‘
将把第三个域中所有数字都去掉。