AWK高级之内部函数使用


点击(此处)折叠或打开

  1. 函数    说明    例句说明    
  2. gsub( Ere, Repl, [ In ] )    全局替换,除了正则表达式所有具体值被替代这点,它和sub 函数完全一样地执行,。    例句:gsub(/[0-9]+/,"!",info)    
  3. sub( Ere, Repl, [ In ] )
  4. gensub(Ere, Repl, h, [In])    sub:第一次出现的替换,用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的字符数量。出现在 Repl参数指定的字符串中的 &(和符号)由 In 参数指定的与Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。
  5. gensub:类似于sub,但是h参数可以控制替换的位置,g/G全局替换,h为数字表示替换第几次出现的位置,具体查看man awk    说明:这时可以用正则表达式,但在awk中的匹配都是用//引起来的,比如/;$/ 以分号结尾,/^#/以#开头;
  6. 更新通配出来的字符,用\(..\) 或者 &
  7. 还可以统计每一行字符出现的次数;    
  8. index( String1, String2 )    在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2参数不在 String1 参数中出现,则返回 0(零)。    略    
  9. length [(String)]    返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。    略    
  10. blength [(String)]    返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。    略    
  11. substr( String, M, [ N ] )    返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到String 参数的末尾 的长度。    substr(a,4,10)    
  12. match( String, Ere )
  13. 可以使用'~'
  14. $0 ~ /partern/    在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。    if (match($0,/31/)    
  15. 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];}}'    
  16. tolower( String )    返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的LC_CTYPE 范畴定义。    略    
  17. toupper( String )    返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的LC_CTYPE 范畴定义。    略    
  18. sprintf(Format, Expr, Expr, . . . )    根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。    详见下面的表格    

  19. 下面着重讲sub的修改字符串与统计字符串以及split功能

  20. 1、gsub求每行出现数字1的次数

  21. awk '{a+=gsub(/1/,"&");print a;a=0}' cs.txt
  22.    ---gsub的特性每匹配成功一个就返回1,所以就可以累加了;这里不能用sub,因为sub只匹配第一个;
  23.    ---也不能用match函数,因为他返回位置并且找到1个就可以了,因为match的目的是找到要匹配的行,而非是字符

  24. 2、gsub修改字符串
  25. [root@wmsvmpc ~]# cat cs.txt
  26. PBCSPOFT0101 96
  27. PBCSPOFT0102 6
  28. PBCSPOFT0103 8
  29. PBCSPOFT0104 0
  30. PBCSPOFT0105 0
  31. PBCSPOFT0106 0

  32. [root@wmsvmpc ~]# awk '{a=gensub(/PBCSPOFT([0-9]+).*/,"\\1",1);print a}' cs.txt --gensub不能改变awk中已经定义的$0,$1-$n的值,所以得重定义
  33. 0101
  34. 0102
  35. 0103
  36. 0104
  37. 0105
  38. 0106
  39.     ----gensub使用()的方式来保存变量值,用\\1的方式引用变量值,而gsub用&来引用变量值
  40.     [root@wmsvmpc ~]# awk '{gsub(/([0-9]+)/,"#&");print}' cs.txt ---gsub只能替换所有的
  41. PBCSPOFT#0101 #96
  42. PBCSPOFT#0102 #6
  43. PBCSPOFT#0103 #8
  44. PBCSPOFT#0104 #0
  45. PBCSPOFT#0105 #0
  46. PBCSPOFT#0106 #0

  47. [root@wmsvmpc ~]# awk '{a=gsub(/([0-9]+)/,"&");print a}' cs.txt ---gsub返回的是成功的个数,所以无法单独提取匹配的数字
  48. 2
  49. 2
  50. 2
  51. 2
  52. 2


  53. 3、split分割成数组
  54. 分割info,动态创建数组tA,这里比较有意思,awk for …in 循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。
  55. 使用split返回字符串数组元素个数。工作方式如下:如果有一字符串,包含一指定分隔符-,例如AD2-KP9-JU2-LP-1,将之划分成一个数组。使用split,指定分隔符及数组名。此例中,命令格式为("AD2-KP9-JU2-LP-1",parts_array,"-"),split然后返回数组下标数,这里结果为4。还有一个例子使用不同的分隔符。

  56. [root@wmsvmpc ~]# awk 'BEGIN {print split("123#456#678", myarray, "#")}'
  57. 3
  58. [root@wmsvmpc ~]# awk 'BEGIN{{print split("123#456#678", myarray, "#")}{for (i in myarray) print i,myarray[i]}}' ---可以看出来split返回的是元素的个数
  59. 3
  60. 1 123
  61. 2 456
  62. 3 678

  63. SPRINTF 格式化字符串输出 (sprintf有一个秒用,当变量后面不跟\n时打印的字符串都在一行的,所以就能快速实现拼接)
  64. 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符,"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。
  65.  
  66.  
  67. 格式符    说明    
  68. %d    十进制有符号整数    
  69. %u    十进制无符号整数    
  70. %f    浮点数    
  71. %s    字符串    
  72. %c    单个字符    
  73. %p    指针的值    
  74. %e    指数形式的浮点数    
  75. %x    %X 无符号以十六进制表示的整数    
  76. %o    无符号以八进制表示的整数    
  77. %g    自动选择合适的表示法    
  78. [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);}'
  79. 124.11,18446744073709551615,1.2,7C,174

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25960404/viewspace-1818872/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25960404/viewspace-1818872/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值