下表是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 参数指定的 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 |
下面举例说明一下:
1.gsub/sub
gsub和sub的区别仅在于前者是替换所有的字符,后者仅替换一个,这一点有点像php中的preg_match_all和preg_match:
- awk 'BEGIN{info="Hello 2012 11!";gsub(/[0-9]+/,"",info);print info}'
输出:
- Hello !
说明:
程序会将所有的1个或多个数字替换成空,所以剩下的就只有字符,空格和叹号了。
下面看一下将gsub换成sub后的结果:
- awk 'BEGIN{info="Hello 2012 11!";sub(/[0-9]+/,"",info);print info}'
输出:
- Hello 11!
说明:
由上可以看出,只有第一个数字被替换了。
2.index
查找字符中首次出现某子串的位置
- awk 'BEGIN{info="Hello 2012 11!";print index(info, 11);}'
输出:
- 12
说明:
index会返回找到的字符串的出现位置,位置是从1开始,如果没有找到就会返回0。
3.length
取字符串或数组长度
- awk 'BEGIN{info="Hello 中国2012 11!";print length(info);}'
输出:
- 20
说明:
length函数返回了字符串的长度。可以看到中文占了3个字节。
4.substr
字符串截取
- awk 'BEGIN{info="Hello 中国2012 11!";print substr(info,7,6);}'
输出:
- 中国
说明:
从第7号位置开始向后截取6个字符,需要注意的是,对于多字节字符很容易截出乱码,慎用!这与php的substr很类似,只是不支持逆向截取。
5.match
用于匹配字符串,如果能找到,就返回其位置,与index类似。
- awk 'BEGIN{info="Hello 2012 11!";print match(info,/2/);}'
输出:
- 7
说明:
match支持正则的查找,而index仅仅支持字符串的查找,match功能更强大。
6.split
字符串切分
- awk 'BEGIN{info="Hello 2012 11!";split(info, A);n=length(A);for(i=1;i<=n;i++) print A[i];}'
输出:
- Hello
- 2012
- 11!
说明:
split在没有指定分隔符时,以默认的字段分隔符将字符串进行切分,切分后的数据保存在A数组中,length取得了数组的长度,循环从1开始,直至n,输出每一个数组元素。
7.tolower/toupper
字符串大小写转换函数
- awk 'BEGIN{info="Hello 2012 11!";print tolower(info);print toupper(info);}'
输出:
- hello 2012 11!
- HELLO 2012 11!
说明:
tolower将字符全部转小写,toupper将字符全部转大写,这与php中的strtolower和strtoupper相似。
8.sprintf/printf
sprintf格式化字符串并返回结果,而printf格式化输出字符串。
- awk 'BEGIN{str=sprintf("%d %s", 32, "years old");printf("%.2f\n", 3.1415926);print str;}'
输出:
- 3.14
- 32 years old
说明:
%d整型,%s字符串,%.2f精确到小数点后两位的浮点数,printf直接输出,sprintf处理后将结果保存到str中,再用print来输出str。