Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 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 
使用“>”将数据写入文件,直接覆盖;“>>”,附加。