点击(此处)折叠或打开
- 函数 说明 例句说明
- gsub( Ere, Repl, [ In ] ) 全局替换,除了正则表达式所有具体值被替代这点,它和sub 函数完全一样地执行,。 例句:gsub(/[0-9]+/,"!",info)
- sub( Ere, Repl, [ In ] )
- gensub(Ere, Repl, h, [In]) sub:第一次出现的替换,用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的字符数量。出现在 Repl参数指定的字符串中的 &(和符号)由 In 参数指定的与Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。
- gensub:类似于sub,但是h参数可以控制替换的位置,g/G全局替换,h为数字表示替换第几次出现的位置,具体查看man awk 说明:这时可以用正则表达式,但在awk中的匹配都是用//引起来的,比如/;$/ 以分号结尾,/^#/以#开头;
- 更新通配出来的字符,用\(..\) 或者 &;
- 还可以统计每一行字符出现的次数;
- index( String1, String2 ) 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2参数不在 String1 参数中出现,则返回 0(零)。 略
- length [(String)] 返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 略
- blength [(String)] 返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 略
- substr( String, M, [ N ] ) 返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到String 参数的末尾 的长度。 substr(a,4,10)
- match( String, Ere )
- 可以使用'~'
- $0 ~ /partern/ 在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。 if (match($0,/31/)
- split( String, A, [Ere] ) 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。 awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
- tolower( String ) 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的LC_CTYPE 范畴定义。 略
- toupper( String ) 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的LC_CTYPE 范畴定义。 略
- sprintf(Format, Expr, Expr, . . . ) 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 详见下面的表格
-
- 下面着重讲sub的修改字符串与统计字符串以及split功能
-
- 1、gsub求每行出现数字1的次数
-
- awk '{a+=gsub(/1/,"&");print a;a=0}' cs.txt
- ---gsub的特性每匹配成功一个就返回1,所以就可以累加了;这里不能用sub,因为sub只匹配第一个;
- ---也不能用match函数,因为他返回位置并且找到1个就可以了,因为match的目的是找到要匹配的行,而非是字符
-
- 2、gsub修改字符串
- [root@wmsvmpc ~]# cat cs.txt
- PBCSPOFT0101 96
- PBCSPOFT0102 6
- PBCSPOFT0103 8
- PBCSPOFT0104 0
- PBCSPOFT0105 0
- PBCSPOFT0106 0
-
- [root@wmsvmpc ~]# awk '{a=gensub(/PBCSPOFT([0-9]+).*/,"\\1",1);print a}' cs.txt --gensub不能改变awk中已经定义的$0,$1-$n的值,所以得重定义
- 0101
- 0102
- 0103
- 0104
- 0105
- 0106
- ----gensub使用()的方式来保存变量值,用\\1的方式引用变量值,而gsub用&来引用变量值
- [root@wmsvmpc ~]# awk '{gsub(/([0-9]+)/,"#&");print}' cs.txt ---gsub只能替换所有的
- PBCSPOFT#0101 #96
- PBCSPOFT#0102 #6
- PBCSPOFT#0103 #8
- PBCSPOFT#0104 #0
- PBCSPOFT#0105 #0
- PBCSPOFT#0106 #0
-
- [root@wmsvmpc ~]# awk '{a=gsub(/([0-9]+)/,"&");print a}' cs.txt ---gsub返回的是成功的个数,所以无法单独提取匹配的数字
- 2
- 2
- 2
- 2
- 2
-
-
- 3、split分割成数组
- 分割info,动态创建数组tA,这里比较有意思,awk for …in 循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。
- 使用split返回字符串数组元素个数。工作方式如下:如果有一字符串,包含一指定分隔符-,例如AD2-KP9-JU2-LP-1,将之划分成一个数组。使用split,指定分隔符及数组名。此例中,命令格式为("AD2-KP9-JU2-LP-1",parts_array,"-"),split然后返回数组下标数,这里结果为4。还有一个例子使用不同的分隔符。
-
- [root@wmsvmpc ~]# awk 'BEGIN {print split("123#456#678", myarray, "#")}'
- 3
- [root@wmsvmpc ~]# awk 'BEGIN{{print split("123#456#678", myarray, "#")}{for (i in myarray) print i,myarray[i]}}' ---可以看出来split返回的是元素的个数
- 3
- 1 123
- 2 456
- 3 678
-
- SPRINTF 格式化字符串输出 (sprintf有一个秒用,当变量后面不跟\n时打印的字符串都在一行的,所以就能快速实现拼接)
- 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符,以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。
-
-
- 格式符 说明
- %d 十进制有符号整数
- %u 十进制无符号整数
- %f 浮点数
- %s 字符串
- %c 单个字符
- %p 指针的值
- %e 指数形式的浮点数
- %x %X 无符号以十六进制表示的整数
- %o 无符号以八进制表示的整数
- %g 自动选择合适的表示法
- [chengmo@centos5 ~]$ awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}'
- 124.11,18446744073709551615,1.2,7C,174
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25960404/viewspace-1818872/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25960404/viewspace-1818872/