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

本文详细介绍了awk语言中的字符串处理函数,包括gsub、index、length、match、split、sub、substr等,并通过实例展示了如何使用这些函数进行字符串操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/chen_linbo/article/details/8223432



### 关于 `awk` 中字符串函数的使用 #### 常见字符串函数及其功能 `awk` 提供了一系列用于处理字符串的强大内置函数。这些函数能够帮助用户执行诸如截取子串、替换字符以及计算长度等常见操作。 - **length(string)**: 返回给定字符串的长度[^1]。 ```bash echo "hello world" | awk '{print length($0)}' ``` - **substr(string, start [, length])**: 获取从指定位置开始的一个子串,可选参数表示要获取的最大字符数。 ```bash echo "hello world" | awk '{print substr($0,7,5)}' # 输出world ``` - **index(bigstring, littestring)**: 查找一个小字符串在一个大字符串中的首次出现的位置;如果找不到,则返回零。 ```bash echo "hello world" | awk '{print index($0,"world")}' # 输出7 ``` - **match(string, regexp)**: 测试正则表达式是否匹配整个字符串,并设置RSTART和RLENGTH两个特殊变量来指示匹配部分的信息。 ```bash echo "hello world" | awk 'BEGIN{FS=" ";}{if(match($2,/or/)){print RSTART,RLENGTH}}' # 输出4 2 ``` - **split(string, array, fieldsep)**: 将一个字符串按照分隔符分割成多个字段存入数组中,第三个参数为可选项,默认为空白字符作为分隔符。 ```bash echo "apple orange banana" | awk '{n=split($0,a);for(i=1;i<=n;i++)print a[i]}' ``` - **tolower(string), toupper(string)**: 把所有的字母转换成小写或大写的版本。 ```bash echo "Hello World" | awk '{print tolower($0)}' # hello world echo "Hello World" | awk '{print toupper($0)}' # HELLO WORLD ``` 以上就是一些常用的 `awk` 字符串处理函数的例子,通过它们可以在脚本编写过程中更加灵活地操控文本数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值