awk这个名字起源于其三个作者( Alfred Aho,Peter Weinberger, 和 Brian Kernighan)的姓氏简称,并非有啥特定的意义。在linux系统中,通过man awk,我们可以看到对它的一句话描述为“gawk - pattern scanning and processing language”,也就是awk是一门模式匹配和处理的语言。在实际的应用中,它是一款非常高效的文本处理工具。
目录
语法介绍
awk [选项参数] ‘script’ var=value file(s)
或者
awk [选项参数] -f scriptfile var=value file(s)
其中,第一个语法命令是面向命令行的模式,即所有的脚步操作命令都写在当前行中。 第二个语法命令是面向文本模式的,它会从文本中读取命令并进行执行。
参数和运算符说明
-F 分隔符号,用于指定分隔输入行的分隔符号。如果只是单个分隔符,只需要单引号引入即可。比如-F ',',如果有多个分隔符 号,则需要用中括号包含多个分隔符,比如 -F'[,.]'。
-v 定义一个变量。如果要定义多个变量,则需要分别引入该参数。 比如: awk -va=1 -vb=2
-f 读取awk命令文件。
$ 字段引用,用于读取指定列的值。
$0 匹配的整行内容
$i 指定i列的值
NF 一行记录分隔的列数
NR 行号
OFS 输出分隔符号
BEGIN{执行循环之前的命令}/{挨行执行的命令}/END{执行循环之后的命令},关于这个命令详情可参考AWK工作原理
实例说明
下面分别列举几个awk命令的案例
如果我们有一个nginx日志,列之间以tab进行分隔,第一列是日期时间,第二列是报错信息,包括:INFO、ERROR、WARNING等,第三列是http状态码,第四列为超时时间,第五列为ref。格式如下:
[2018-11-30 11:10:10] ERROR 500 0.023 http://www.csdn.net
[2018-11-30 11:20:11] INFO 200 0.013 http://www.baidu.com
[2018-11-30 11:40:12] ERROR 500 0.033 http://www.163.com
[2018-11-30 11:50:13] INFO 200 0.021 http://www.baidu.com
[2018-11-30 12:00:14] ERROR 500 0.023 http://www.baidu.com
[2018-11-30 12:10:15] ERROR 500 0.013 http://www.sina.com
[2018-11-30 12:50:16] WARNING 200 0.033 http://www.baidu.com
[2018-11-30 13:10:17] ERROR 500 0.023 http://www.baidu.com
[2018-11-30 13:20:18] INFO 200 0.013 http://www.sina.com
[2018-11-30 13:55:19] ERROR 500 0.033 http://www.google.com
1.尝试统计每个小时的请求量
awk -F '[\t:]' '{sum[$1]+=1}END{for(i in sum){print i" : "sum[i]}}' log.txt
输出为
[2018-11-30 13 : 3
[2018-11-30 11 : 4
[2018-11-30 12 : 3
2.取出所有报错信息为ERROR的行的ref及其出现次数
awk -F '\t' '{if($2=="ERROR"){sum[$5]+=1}}END{for(i in sum){print i" : "sum[i]}}' log.txt
http://www.google.com : 1
http://www.sina.com : 1
http://www.baidu.com : 2
http://www.csdn.net : 1
http://www.163.com : 1