30 分钟包你学会 AWK( 三 )


正则表达式
AWK在处理正则表达式方面是非常强大的,使用简单的正则表达式可以处理非常复杂的问题 。

30 分钟包你学会 AWK

文章插图

30 分钟包你学会 AWK

文章插图
数组
AWK支持关联数组,也就是说,不仅可以使用数字索引的数组,还可以使用字符串作为索引,而且数字索引也不要求是连续的 。数组不需要声明可以直接使用,语法如下:
 
在AWK中,只支持一维数组,但是可以通过一维数组模拟多维,例如我们有一个3×3的三维数组
 
流程控制
流程控制语句与大多数语言一样,基本格式如下
30 分钟包你学会 AWK

文章插图
循环
循环操作与其他C系语言一样,主要包括 for , while , do...while , break , continue 语句,当然,还有一个 exit 语句用于退出脚本执行 。
30 分钟包你学会 AWK

文章插图
exit 用于退出脚本,参数为退出的状态码,可以通过shell中的 $? 获取
函数
内建函数
AWK提供了很多方便的内建函数供编程人员使用 。由于函数比较多,个人觉得单纯看每个函数的使用也没有什么实际意义,比较容易遗忘,因此,这里只简单的列出常用的一些函数,只需要对其有个印象即可,使用的时候再去 查手册 效果会更好一些吧 。
数学函数
  • atan2(y, x)
  • cos(expr)
  • exp(expr)
  • int(expr)
  • log(expr)
  • rand
  • sin(expr)
  • sqrt(expr)
  • srand([expr])
字符串函数
  • asort(arr [, d [, how] ])
  • asorti(arr [, d [, how] ])
  • gsub(regex, sub, string)
  • index(str, sub)
  • length(str)
  • match(str, regex)
  • split(str, arr, regex)
  • sprintf(format, expr-list)
  • strtonum(str)
  • sub(regex, sub, string)
  • substr(str, start, l)
  • tolower(str)
  • toupper(str)
时间函数
  • systime
  • mktime(datespec)
  • strftime([format [, timestamp[, utc-flag]]])
字节操作函数
  • and
  • compl
  • lshift
  • rshift
  • or
  • xor
其它
30 分钟包你学会 AWK

文章插图

30 分钟包你学会 AWK

文章插图

30 分钟包你学会 AWK

文章插图

30 分钟包你学会 AWK

文章插图

30 分钟包你学会 AWK

文章插图
用户自定义函数
函数是程序基本的组成部分,AWK允许我们自己创建自定义的函数 。一个大型的程序可以被划分为多个函数,每个函数之间可以独立的开发和测试,提供可重用的代码 。
下面是用户自定义函数的基本语法
30 分钟包你学会 AWK

文章插图
输出重定向重定向操作符
到目前为止,我们所有的程序都是直接显示数据到了标准输出流,其实,我们也可以将输出重定向到文件 。重定向操作符跟在 print 和 printf 函数的后面,与shell中的用法基本一致 。
30 分钟包你学会 AWK

文章插图
管道
除了将输出重定向到文件之外,我们还可以将输出重定向到其它程序,与shell中一样,我们可以使用管道操作符 |。
30 分钟包你学会 AWK

文章插图
第一次I/O操作使用了 |& 操作符,gawk会创建一个到运行其它程序的子进程的双向管道, print 的输出被写入到了 subprogram 的标准输入,而这个 subprogram 的标准输出在gawk中使用 getline 函数进行读取 。
注意:目前协同进程的标准错误输出将会和gawk的标准错误输出混杂在一起,无法单独获取标准错误输出 。另外,I/O缓冲可能存在问题,gawk程序会自动的刷新所有输出到下游的协同进程的管道 。但是,如果协同进程没有刷新其标准输出的话,gawk将可能会在使用 getline 函数从协同进程读取输出的时候挂起,这就可能引起死锁 。
我们可以使用 close 函数关闭双向管道的 to或者 from一端,这两个字符串值告诉gawk发送数据到协同进程完成时或者从协同进程读取完毕时关闭管道 。在使用系统命令 sort 的时候是这样做是非常必要的,因为它必须等所有输出都读取完毕时才能进行排序 。


推荐阅读