awk简介
其中pattern
表示AWK在数据中查找的内容,而action
是在找到匹配内容时所执行的一系列命令。
awk命令的输入
awk命令采用两种类型的输入:文本文件和程序指令
文本文件
搜索和操作在输入文本文件上执行:
- 命令行指定文件
- 修改特殊变量ARGV和ARGC
- 未提供文件的情况下提供标准输入
程序指令
用户提供的指令控制 awk 命令的操作。这些指令来自命令行的Program
变量或来自用 -f
标志和 ProgramFile
变量一起指定的文件。如果指定多个程序文件,这些文件按指定顺序并置,且使用指令的生成的顺序。
awk命令的输出
awk命令有三种输出类型:
- 选定数据直接打印至标准输出,此输出等同于文本文件
- 输入文件的选定部分可更改
- 选定数据更改并打印
awk命令编程语言
awk程序是由一系列模式–动作对组成的,写做
pattern { action }
awk命令编程语言主要包含如下四种模式
正则表达式
类似于grep的使用方式。例如给定文本文件
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
输入命令awk '/smi/' testfile
,可以在标准输出看到如下结果
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
匹配多个字符串可使用连接符+
,例如输入命令awk '/smith+ern/' testfile
,可看到结果
smithern, harry
smithhern, anne
正则表达式其他通配符可自行尝试。
关系表达式
awk同样支持关系运算符<,>,<=,>=,==,!=
。
例如给定文本文档
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
输入以下命令awk 'BEGIN{FS=","}{if(length($1) > 6)print $1}' testfile
,可得到结果
smawley, andy
smithern, harry
smithhern, anne
smitters, alexis
对于有编程基础的读者来说上面的命令很容易理解。首先设置FS
即设置分隔符为,
,然后判断长度大于6才进行输出,这里可能会不明白$1
代表的含义。我理解$+数字
代表的是对每行文本分隔以后的引用。$0
代表内容本身,$1
代表第一列以此类推。
模式组合
在上一节的例子中其实我们已经看到了多种模式的组合可以更方便完成我们想要的结果。
BEGIN/END模式
之前的例子中使用了BEGIN模式。用 BEGIN 模式指定的操作在读取任何输入之前执行。用 END 模式指定的操作在读取了所有输入后执行。允许多个 BEGIN 和 END 模式,并以指定的顺序处理它们。有兴趣的读者可以试试之前的例子如果不使用BEGIN模式会得到什么结果。
操作
语法规则
awk支持类似c语言的语法,包括算术语句,一元表达式,增量和减量语句,赋值语句,条件语句,函数调用,自定义函数等等。不过变量定义有些不同,类似于python的方式可直接定义不需要添加变量类型或者以其他关键字开头。例如给定如下形式的日志文件
2018-12-03 13:26:47.012 INFO cn.xxx.xxx.xxx.xxx.xxxAction: [82] - [XXX] Resp-client busCode:00000 trace:_a76b93c501c97136461c4e39884e007c timeUsed=18 data={“code”:“110001”,“msg”:“对不起,服务器暂时无法响应,请稍后再试”}
需要统计其中累计耗时,可使用如下命令
cat INFO.log | awk '{for(i = 1;i < 25;i++){if($i != null && match($i,"timeUsed")){count += substr($i,10)}}}END{print "count: ", count}'
其中首先循环找出符合条件的列,然后截取时间后累加,获取到所有输出以后使用END
模式输出
特殊变量
awk内置了很多特殊变量,这里仅列举上文提到过的几个。
变量名 | 含义及作用 |
---|---|
ARGV | 其每个成员包含 File 变量之一或 Assignment 变量之一的数组按序从命令行取出,并从 0(零)编号至 ARGC -1 。当每个输入文件完成时,ARGV 数组的下一个成员提供下一个输入文件的名称 |
ARGC | ARGV 数组中的元素个数。此值可以更改。 |
FS | 输入字段分隔符。缺省值是空格。如果输入字段分隔符是空格,那么任何数目的语言环境定义的空格可以分隔字段。 |
参考文章
https://zh.wikipedia.org/wiki/AWK
https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_72/com.ibm.aix.cmds1/awk.htm#awk__a10498fe