您的位置:首页 > 其它

awk中gsub和sub 的用法

2014-05-26 17:59 381 查看
转自:http://blog.csdn.net/zhuying_linux/article/details/7104938

函数则使得在所有正则表达式被匹配的时候都发生替换

gsub(regular expression,
subsitution string, target string);简称 gsub(r,s,t)

一、遇到的问题:
问题:echo
"a b c 2011-11-22 a:d" | awk '$4=gsub(/-/,"",$4)'为啥 输出后 2011-11-22 变成 2 了?
解答:
gsub(/-/,"",$4)的值是2【在赋值的情况下是这样的~】,你将2赋值给$4 ,gsub返回的是替换的次数。
如下是测试结果:
[root@Test230
~]# echo "a b c 2011-11-22 a:d" | awk '$4=gsub(/-/,"",$4)'

a b c 2 a:d
看另一种情况,只是替换的话~
[root@sor-sys config]# echo "a b c 2011-11-22 a:d" | awk
'gsub(/-/,"",$4)'
a b c 20111122 a:d
[root@sor-sys config]# echo "a b c
2011-11-22 a:d" | awk 'gsub(/-/,"_",$4)'
a b c 2011_11_22 a:d

二。实例详解
下面我们来总结一下这个gsub的用法:
有一个文本文件data.test的内容如下:
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 '|' 'BEGIN{ OFS="|" }
{sub(/[0-9]+/,"",$2);print $0}'
data.test

awk -F '|' -v OFS='|'
'{sub(/[0-9]+/,"",$2);print $0}' data.test

三。sub和gsub的区别
sub匹配第一次出现的符合模式的字符串,相当于 sed 's//'

gsub匹配所有的符合模式的字符串,相当于 sed 's//g' 。
例如:
awk
'{sub(/Mac/,"Macintosh");print}' urfile 用Macintosh替换Mac
awk
'{sub(/Mac/,"MacIntosh",$1); print}' file 第一个域内用
Macintosh替换Mac
把上面sub换成gsub就表示在满足条件得域里面替换所有的字符。

awk的sub函数用法:
sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并
用替换字符串替换这些字符串。
如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配
的时候。格式如下:
sub (regular expression,
substitution string):
sub (regular expression, substitution string, target
string)
实例:
$ awk '{ sub(/test/, "mytest"); print }' testfile
$ awk '{
sub(/test/, "mytest", $1); print }'
testfile
第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。
第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配
发生的时候。
如要在整个文件中进行匹配需要用到gsub
gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:
gsub
(regular expression, substitution string)
gsub (regular expression,
substitution string, target string)
实例:
$ 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; }'
data.txt

将把第三个域中所有数字都去掉。

另外,对于数字的匹配,可以使用十六进制。

awk -F'|' -v OFS='|' '{ gsub(/[/x30-/x39]/,
"", $3); print $0; }'
data.txt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息