一。遇到的問題:
問題: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的用法:
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 '|' '' data.test
三。sub和gsub的區別
sub匹配第一次出現的符合模式的字串,相當於 sed 's//'
gsub匹配所有的符合模式的字串,相當於 sed 's//g'
awk的sub函式用法:
sub函式匹配指定域/記錄中最大、最靠左邊的子字串的正規表示式,並用替換字串替換這些字串。如果沒有指定目標字串就預設使用整個記錄,替換只發生在第一次匹配的時候。
例項:$ awk '' testfile
$ awk '' testfile
第乙個例子在整個記錄中匹配,替換只發生在第一次匹配發生的時候。
第二個例子在整個記錄的第乙個域中進行匹配,替換只發生在第一次匹配發生的時候
gsub函式作用如sub,但它在整個文件中進行匹配。
例項:$ awk '' testfile
$ awk '' testfile
第乙個例子在整個文件中匹配test,匹配的都被替換成mytest。
第二個例子在整個文件的第乙個域中匹配,所有匹配的都被替換成mytest。
只有當記錄中的域有改變的時候
,指定0fs變數才有用, 如果記錄中的域無變化, 指定ofs產生不了實際效果。
awk -f'|' -v ofs='|' '' data.txt
將把第三個域中所有數字都去掉。
ruby中gsub和gsub 的區別
ruby中帶 和不帶 的方法的最大的區別就是帶 的會改變呼叫物件本身了。比方說str.gsub a b 不會改變str本身,只會返回乙個新的str。而str.gsub a b 就會把str本身給改了。但是gsub和gsub 還有另外乙個不同點就是,gsub不管怎麼樣都會返回乙個新的字串,而gsub ...
ruby中gsub和gsub 的區別
ruby中帶 和不帶 的方法的最大的區別就是帶 的會改變呼叫物件本身了。比方說str.gsub a b 不會改變str本身,只會返回乙個新的str。而str.gsub a b 就會把str本身給改了。但是gsub和gsub 還有另外乙個不同點就是,gsub不管怎麼樣都會返回乙個新的字串,而gsub ...
Linux中awk命令的使用
awk 引數 filename引數 含義 f 分割字串 要執行的操作裡面可以使用if,for,正規表示式 awk內建變數 變數含義 nr當前行號 nf當前行分隔出了多少列 awk f debug.log f 表示每一行用逗號分隔 表示列印出每行的第一列 awk f debug.log s 表示字串佔...