awk学习笔记(16) - 字符串函数

下表是awk所支持的字符串处理函数:

函数说明
gsub( Ere, Repl, [ In ] )除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行,。
sub( Ere, Repl, [ In ] )用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。
index( String1, String2 )在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。
length [(String)]返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。
substr( String, M, [ N ] )返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。
match( String, Ere )在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。
split( String, A, [Ere] )将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。
tolower( String )返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。
toupper( String )返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。
sprintf(Format, Expr, Expr, . . . )根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。

下面举例说明一下:

1.gsub/sub

gsub和sub的区别仅在于前者是替换所有的字符,后者仅替换一个,这一点有点像php中的preg_match_all和preg_match:

 
  
  1. awk 'BEGIN{info="Hello 2012 11!";gsub(/[0-9]+/,"",info);print info}' 

输出:

 
  
  1. Hello  ! 

说明:

程序会将所有的1个或多个数字替换成空,所以剩下的就只有字符,空格和叹号了。

下面看一下将gsub换成sub后的结果:

 
  
  1. awk 'BEGIN{info="Hello 2012 11!";sub(/[0-9]+/,"",info);print info}' 

输出:

 
  
  1. Hello  11! 

说明:

由上可以看出,只有第一个数字被替换了。

2.index

查找字符中首次出现某子串的位置

 
  
  1. awk 'BEGIN{info="Hello 2012 11!";print index(info, 11);}' 

输出:

 
  
  1. 12 

说明:

index会返回找到的字符串的出现位置,位置是从1开始,如果没有找到就会返回0。

3.length

取字符串或数组长度

 
  
  1. awk 'BEGIN{info="Hello 中国2012 11!";print length(info);}' 

输出:

 
  
  1. 20

说明:

length函数返回了字符串的长度。可以看到中文占了3个字节。

4.substr

字符串截取

 
  
  1. awk 'BEGIN{info="Hello 中国2012 11!";print substr(info,7,6);}' 

输出:

 
  
  1. 中国 

说明:

从第7号位置开始向后截取6个字符,需要注意的是,对于多字节字符很容易截出乱码,慎用!这与php的substr很类似,只是不支持逆向截取。

5.match

用于匹配字符串,如果能找到,就返回其位置,与index类似。

 
  
  1. awk 'BEGIN{info="Hello 2012 11!";print match(info,/2/);}'  

输出:

 
  

说明:

match支持正则的查找,而index仅仅支持字符串的查找,match功能更强大。

6.split

字符串切分

 
  
  1. awk 'BEGIN{info="Hello 2012 11!";split(info, A);n=length(A);for(i=1;i<=n;i++) print A[i];}' 

输出:

 
  
  1. Hello 
  2. 2012 
  3. 11! 

说明:

split在没有指定分隔符时,以默认的字段分隔符将字符串进行切分,切分后的数据保存在A数组中,length取得了数组的长度,循环从1开始,直至n,输出每一个数组元素。

7.tolower/toupper

字符串大小写转换函数

 
  
  1. awk 'BEGIN{info="Hello 2012 11!";print tolower(info);print toupper(info);}' 

输出:

 
  
  1. hello 2012 11! 
  2. HELLO 2012 11! 

说明:

tolower将字符全部转小写,toupper将字符全部转大写,这与php中的strtolower和strtoupper相似。

8.sprintf/printf

sprintf格式化字符串并返回结果,而printf格式化输出字符串。

 
  
  1. awk 'BEGIN{str=sprintf("%d %s", 32, "years old");printf("%.2f\n", 3.1415926);print str;}' 

输出:

 
  
  1. 3.14 
  2. 32 years old 

说明:

%d整型,%s字符串,%.2f精确到小数点后两位的浮点数,printf直接输出,sprintf处理后将结果保存到str中,再用print来输出str。










本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1051310,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值