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


转自:  http://blog.csdn.net/chen_linbo/article/details/8223432



你可能感兴趣的:(linux,unix,应用)