awk語言內置的字符串函數
——————————————————————————————————————————————————————————————
gsub(r,s) 在整個$0中用s替代r
gsub(r,s,t) 在整個t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s的長度
match(s,r) 測試s是否包含匹配r的字符串
split(s,a,fs) 返回fs上將s分成序列a
sprint(fmt,exp) 返回經fmt格式化後的exp
sub(r,s) 用$0中最左邊最長的子串替代s
substr(s,p) 返回字符串s中從p開始的後綴部分
substr(s,p,n) 返回字符串s中從p開始長度為n的後綴部分
——————————————————————————————————————————————————————————————
1.gsub函數
將包含4842的行中的4842替換為4899:
awk 'gsub(/4842/,4899) {print $0}' grade.txt
J.Troll 07/99 4899 Brown-3 12 26 26
awk '{if($3~/4842/) print $0}' grade.txt[or awk '$0 ~/4842/ ' grade.txt]
J.Troll 07/99 4842 Brown-3 12 26 26
2.index函數
找出ny首次出現的位置:
awk 'END {print index("Bunny","ny")}' grade.txt
4
在第一個域中包含Bunny中找出ny首次出現的位置,並打印此行:
awk '$1~/Bunny/ {print index($1,"ny") ":" $0}' grade.txt
6:P.Bunny 02/99 48 Yello 12 35 28
3.length函數
awk 'if(($1~/Tran/) || (length($1) > 7)) {print $0}' grade.txt
報錯:
awk: Syntax error
at line 1 of program << if(($1~/Tran/) || ( ... >>
context is
>>> if <<< (($1~/Tran/) || (length($1) > 7)) {print $0}
awk: bailing out
at line 1 of program << if(($1~/Tran/) || ( ... >>
錯誤原因:所有的動作要包含在{}內。
正確:
awk '{if(($1~/Tran/) || (length($1) > 7)) {print $0}}' grade.txt
M.Tansley 05/99 48311 Green 8 40 44
L.Tansley 05/99 4712 Brown-2 12 30 28
4.match函數
awk 'BEGIN{print match("abcd",/A/)}'
0
awk 'BEGIN{print match("abcd",/c/)}'
3
awk '$1=="J.Lulu" {print match($1,"u")}' grade.txt
4
5.split函數
awk 'BEGIN {print split("123#456#789",myarray,"#")}'
3
6.sub函數
awk 'if($1~/Troll/) {print $0}' grade.txt
if必須放在{}內,否則
awk: Syntax error
at line 1 of program << if($1~/Troll/) {prin ... >>
context is
>>> if <<< ($1~/Troll/) {print $0}
awk: bailing out
at line 1 of program << if($1~/Troll/) {prin ... >>
awk '{if($1~/Troll/) {print $0}}' grade.txt
J.Troll 07/99 4842 Brown-3 12 26 26
7.substr函數
awk '$1=="L.Tansley" {print substr($1,1,5)}' grade.txt
L.Tan
沒第三個參數
awk '$1=="L.Tansley" {print substr($1,1)}' grade.txt
L.Tansley
地三個參數大於域長度
awk '$1=="L.Tansley" {print substr($1,1,100)}' grade.txt
L.Tansley
指定長度
awk '$1=="L.Tansley" {print substr($1,1,length($1)-1)}' grade.txt
L.Tansle
起始位置為0
awk '$1=="L.Tansley" {print substr($1,0,length($1)-1)}' grade.txt
L.Tansle
截取整行
awk '$1=="L.Tansley" {print substr($0,1,15)}' grade.txt
L.Tansley 05/9
打印截取的數據和原數據
awk '$1=="L.Tansley" {print substr($0,1,15)} END{print $0}' grade.txt
L.Tansley 05/9
L.Tansley 05/99 4712 Brown-2 12 30 28
將截取的字符串連接一個字符串
awk '$1=="L.Tansley" {print substr($0,1,15) "___3 blanks"}' grade.txt
L.Tansley 05/9___3 blanks
取名字
awk '{print substr($1,3)}' grade.txt
Tansley
Lulu
Bunny
Troll
Tansley
8.從shell中向awk傳入字符串
echo "_yeeXun" | awk '{print length($0)}'
7
STR="grade.txt"
echo $STR| awk '{print substr($STR,1,5)}'
awk: illegal field $()
input record number 1, file -
source line 1 of program << {print substr($STR,1 ... >>
錯誤原因:awk不認識$STR,管道命令傳遞過來的數據,被認為$0,所以應該將$STR替換為$0:
echo $STR| awk '{print substr($0,1,5)}'
grade
截取後綴
echo $STR| awk '{print substr($0,7)}'
txt
echo $STR | awk '{print substr($0,match($0,/\./)+1)}'
txt
取目錄下的所有文件的後綴:
ls -l
total 28
-rw-r--r-- 1 xxxx group 0 Nov 19 10:12 cat
-rw-r--r-- 1 xxxx group 28 Nov 14 20:32 cat_file.txt
drwxr-xr-x 2 xxxx group 512 Nov 21 08:30 c_src
-rw-r--r-- 1 xxxx group 356 Nov 16 19:50 data.f
-rw-r--r-- 1 xxxx group 284 Nov 19 10:36 delete_me_and_die
-rwxr--r-- 1 xxxx group 61 Nov 8 09:15 first2
-rw-r--r-- 1 xxxx group 235 Nov 19 10:44 grade.txt
-rwxr--r-- 1 xxxx group 354 Nov 17 11:05 info.txt
-rwxr----- 1 xxxx group 23 Nov 7 19:12 myfile
drwxr-xr-x 2 xxxx group 512 Nov 21 08:30 sql_src
-rwxr--r-- 1 xxxx group 225 Nov 15 18:08 test.bak
-rwxr--r-- 1 xxxx group 225 Nov 15 14:12 test.sql
-rw-r--r-- 1 xxxx group 1998 Nov 15 14:15 who.out
-rw-r--r-- 1 xxxx group 229 Nov 19 14:44 wow
ls -l | awk '{print substr($9,match($9,/\./)+1)}'
cat
txt
c_src
f
delete_me_and_die
first2
txt
txt
myfile
sql_src
bak
sql
out
wow
找到有後綴名的文件
ls -l | awk '{if(match($9,/\./)>0) {print $9}}'
cat_file.txt
data.f
grade.txt
info.txt
test.bak
test.sql
who.out
然後截取後綴:
ls -l | awk '{if(match($9,/\./)>0) {print substr($9,match($9,/\./)+1)}}'
txt
f
txt
txt
bak
sql
out
將文件名字,和後綴名用“#”隔開:
ls -l | awk '{if(match($9,/\./)>0) {print $9"#" substr($9,match($9,/\./)+1)}}'
cat_file.txt#txt
data.f#f
grade.txt#txt
info.txt#txt
test.bak#bak
test.sql#sql
who.out#out
使用“>”將數據寫入文件,直接覆蓋;“>>”,附加。