AIX下awk语言的内置字符串函数

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 

在第一个域中包含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/)}' 

awk 'BEGIN{print match("abcd",/c/)}' 

awk '$1=="J.Lulu" {print match($1,"u")}' grade.txt 

 
5.split函数 
awk 'BEGIN {print split("123#456#789",myarray,"#")}' 

 
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)}' 

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 

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 

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 
使用“>”将数据写入文件,直接覆盖;“>>”,附加。 

相关推荐