顯示廣告
隱藏 ✕
看板 uefacool
作者 uefangsmith (唉呦!不錯哦~)
標題 [Shell] linux中awk下 gsub函數用法
時間 2016-07-29 Fri. 22:11:35


http://tc.chinawin.net/it/os/article-24707.html

linux中awk下 gsub函數用法

gsub函數則使得在所有正則表達式被匹配的時候都發生替換
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

--
※ 作者: uefangsmith 時間: 2016-07-29 22:11:35
※ 看板: uefacool 文章推薦值: 0 目前人氣: 0 累積人氣: 53 
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇