你好,游客 登录 注册 搜索
背景:
阅读新闻

awk 字符串与算数处理

[日期:2017-01-09] 来源:Linux社区  作者:cooling88 [字体: ]

格式化输出 

   awk提供两个高级输出函数printfsprintf,他们提供了格式化输出功能
    - printf函数将格式化字符串打印到标准输出(stdout) 
    - sprintf 函数则返回“可以赋值给变量的字符串”  
  eg.
    print.awk
  1. # printf & sprintf
  2. {
  3. # 第一个字段
  4. x = $1
  5. b ="foo"
  6. # 格式化输出
  7. printf("%s got a %d on last test\n","Jim",83)
  8. # 将格式化的字符串赋给变量
  9. myout = sprintf("%s - %d", b, x)
  10. # 简单输出,自带换行
  11. print myout
  12. }

 

  1. echo 100| awk -f print.awk
  2. Jim got a 83 on last test foo - 100
 
                            格式化输出支持的转义字符(格式说明符)
  1.   c    ACII字符(char型)
  2.   s    字符串
  3.   d    十进制整数
  4.   ld   十进制长整形
  5.   u    十进制无符号整数
  6.   lu   十进制无符号长整数         
  7.   x    十六进制整数
  8.   lx   十六进制长整数 
  9.   o    八进制整数
  10.   lo   八进制长整数
  11.   e    用科学计数法表示的浮点数
  12.   f    浮点数
  13.   g    e/f中较短的一种
  14.    
 
awk还支持一些修饰符,这些修饰符跟在‘%’后面,出现在格式说明符之前可以规定输出域的宽度对齐方式
                                   printf的修饰符
  1.   -    左对齐修饰符
  2.   #    显示8进制数时在前面加个0;16进制数时在前面加个0x
  3.   +    显示使用的defg格式的整数时,前面加上正负号(+/-)
  4.   0    0而不是空白来填充所显示的值
 
格式说明符和修饰符的使用方法:
              %-width.precision format-specifier 
   eg. 
       %10s   // 默认右对齐; 10:输出字段的域长度至少10个字符,不够10个,空白补齐;多余10个时,原样输出  
       %-10s // 同上,- 表示输出左对齐 
       %10.5f  // 字段输出至少10个字符宽度;5-小数点后5位
 
字符串函数
 
1. 子字符串查找
   index(str,subsr)  返回子串subsr在串str中第一次出现的索引(起始位置),index函数字符串的开始位置为1.(C语言为0)
2. 子字符串提取
   substr(str,position[,length]) 返回str中position位置开始的length个字符;缺省length时,返回positio位置开始的所有字符。
    eg.
        awk '{print substr($1,3)}'  // 提取第一个域中从第三个字符起的所有字符
        awk '{print substr($1,5,9)}'  // 提取第一个域中从第5个字符起的后面9个字符
3. 字符串匹配
  match(string,/regexp/) 如果在string中找到匹配正则/regexp/的子字符串,则返回子字符串的起始位置,无法匹配,则返回0
  区别: index()函数查找固定字符串的位置,match()支持正则匹配!
 match()函数会影响两个系统变量:
     RSTART :运行match()后,被设置为匹配上正则表达式的子字符串的起始位置。   
     RLENGTH:运行match()后,被设置为匹配上正则表达式的子字符串的长度。
     若无法匹配,RSTART被设置为0,RLENGTH被设置为-1。
 
4. 子字符串替换
   sub(regexp,replacement,target)
      将target与正则表达式regrxp进行匹配,只替换匹配到的第一个字符串;如果target没有给定,则sub函数默认使用整个记录。
  gsub(regexp,replacement,target)
      // gsub()函数替换所有匹配到的字符串
5.大小写转换
  tolower(string)   将输入文本转为小写
  toupper(string)   将输入文本转为大写
 
6. 字符串分割
  split(string,array,regexp)字符串分割函数
  将string切割为片段,并存储到数组里,分割字符串时的分隔符由正则regexp指定,省略regexp时默认为FS(空格).
   eg.1
  1. [root@web1 test]# cat split.awk
  2. # awk 字符串分隔函数
  3. {
  4. print "\nField seperator = FS \" "FS" \""
  5. n = split($0, array) // 默认使用 空格 为字段分隔符
  6. for(k =1; k <= n; k++) // split函数返回分割后的字符串的个数
  7. {
  8. print "array[k] = " array[k]
  9. }
  10. }
  1. [root@web1 test]# echo "dfssfs sdf dsf dsf "| awk -f split.awk
  2. Field seperator = FS " "
  3. array[k]= dfssfs
  4. array[k]= sdf
  5. array[k]= dsf
  6. array[k]= dsf
 
 eg.2
  1. [root@web1 test]# cat split.awk
  2. # awk 字符串分隔函数
  3. {
  4. print "\nField seperator = :"
  5. n = split($0, array,":") // 指定分隔符为 ":"
  6. for(k =1; k <= n; k++)
  7. {
  8. print "array[k] = " array[k]
  9. }
  10. }
 
 
  1. [root@web1 test]# head -n2 /etc/passwd | awk -f split.awk
  2. Field seperator =:
  3. array[k]= root
  4. array[k]= x
  5. array[k]=0
  6. array[k]=0
  7. array[k]= root
  8. array[k]=/root
  9. array[k]=/bin/bash
  10. Field seperator =:
  11. array[k]= bin
  12. array[k]= x
  13. array[k]=1
  14. array[k]=1
  15. array[k]= bin
  16. array[k]=/bin
  17. array[k]=/sbin/nologin
 
split("",array) // 快速清空数组
 
7. 字符串重建
 eg.1 
 
  1. [root@web1 test]# awk 'BEGIN{ s1 = "hello "; s2 = "ollir "; s = s1 s2 ; print s}'
  2. hello ollir
  1. [root@web1 test]# awk 'BEGIN{ s1 = "hello "; s2 = "ollir "; s = sprintf("%s%s",s1 ,s2); print s}'
  2. hello ollir
 
算术函数
   1.常用函数
  三角函数sin()、cos()  // 输入参数为弧度角,不是30°之类的角度,要转化为弧度 
  atan(x,y)  // x,y范围内的余切 
  exp(x)     // 以e为底数的指数
  log()    // 自然对数
  sqrt()  // 平方根
  2.取整函数
  int() 取实型数字的整数部分,直接忽略小数部分
 eg. 
  1. print int(10.6) 
  2. 10
 
3.随机数
  rand() 生成一个0-1之间的浮点型随机数
srand(x)为随机数发生器设置一个种子,种子数值为x,如果x未传入参数,则srand()函数将当前时间作为种子。
    如果没有调用srand()来设置随机种子的话,awk在开始执行程序前默认以某个常量作为参数调用srand(),使得程序每次运行时都以同一个随机种子开始,这样使得所得的随机数序列每次运行都相同,这可以用于重复测试相同的操作。
eg.
  1. [root@web1 test]# cat rand.awk
  2. BEGIN {
  3. # 没有显式调用srand()设置种子,awk使用默认常量作为参数传入srand()设置固定的种子
  4. print rand() // 随机数固定
  5. print rand()
  6. # srand()使用当前时间作为参数上设置种子
  7. srand()
  8. print rand() //随机数与当前时间有关
  9. print rand()
  10. }
  11. {}
  12. [root@web1 test]# echo ""| awk -f rand.awk
  13. 0.237788
  14. 0.291066
  15. 0.0421086
  16. 0.447394
  17. [root@web1 test]# echo ""| awk -f rand.awk
  18. 0.237788
  19. 0.291066
  20. 0.874176
  21. 0.562551

 

Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm

 

Linux系统之文本格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm

 

AWK简介及使用实例 http://www.linuxidc.com/Linux/2013-12/93519.htm

 

Linux awk文本分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm

 

Linux文本处理工具之awk  http://www.linuxidc.com/Linux/2015-01/111437.htm

 

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

 

文本分析工具-awk  http://www.linuxidc.com/Linux/2014-12/110939.htm

 

AWK入门基础教程  http://www.linuxidc.com/Linux/2016-12/138138.htm

 

使用awk格式化输出文本 http://www.linuxidc.com/Linux/2016-04/130193.htm

 

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-01/139373.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款