使用 AWK 格式化 Nginx 日志

更新日期: 2019-05-25 阅读次数: 250 字数: 310 分类: Nginx

awk 命令最让人头疼的地方是,只要一个月不用,立马忘掉命令参数。

例如,我想查看访问了接口 A 的所有请求的手机品牌。

grep api_a /var/log/nginx/sunzhongwei_access.log | awk '{print $4, $7, $14, $15, $16, $17}'
[25/May/2019:08:50:20 /api/api_a Android 8.0.0; MIX Build/OPR1.170623.032;
[25/May/2019:08:57:52 /api/api_a Android 8.1.0; MI 8
[25/May/2019:08:58:08 /api/api_a Android 8.1.0; MI 8
[25/May/2019:11:02:37 /api/api_a Android 8.1.0; V1732A Build/O11019;
[25/May/2019:11:07:04 /api/api_a Android 9; MI 8
[25/May/2019:11:12:00 /api/api_a Android 8.0.0; LND-AL30 Build/HONORLND-AL30;
[25/May/2019:11:18:27 /api/api_a CPU iPhone OS 11_2_6
[25/May/2019:11:19:48 /api/api_a CPU iPhone OS 11_2_6
[25/May/2019:11:21:20 /api/api_a CPU iPhone OS 12_1_4
[25/May/2019:11:22:33 /api/api_a CPU iPhone OS 11_2_6

除了 awk 的语法记不住之外,调试每个字段对应的 index 也是个麻烦而耗时的事情。我只能逐个尝试。

今天找到了一个可以自动打印出所有字段 index 的方法:

查看所有字段的 index value

grep api_a /var/log/nginx/sunzhongwei_access.log | head -n 1 | awk '{ for (i = 1; i <= NF; ++i) { print i, $i; } }'

1 101.91.60.23
2 -
3 -
4 [25/May/2019:14:42:12
5 +0800]
6 "POST
7 /api/api_a
8 HTTP/1.1"
9 200
10 40
11 "https://servicewechat.com/wxee9e87b567235537/0/page-frame.html"
12 "Mozilla/5.0
13 (iPhone;
14 CPU
15 iPhone
16 OS
17 9_1
18 like
19 Mac
20 OS
21 X)
22 AppleWebKit/601.1.46
23 (KHTML,
24 like
25 Gecko)
26 Version/9.0
27 Mobile/13B143
28 Safari/601.1
29 MicroMessenger/6.7.3
30 Language/zh_CN
31 token/xxx"
32 -
33 "unix:/run/php/php7.0-fpm.sock"
34 "200"
35 "0.032"
36 "0.032"

head - output the first part of files

爱评论不评论

近期节日

2019年06月20日 世界难民日
2019年06月21日 夏至
2019年06月22日 中国儿童慈善活动日
2019年06月23日 国际奥林匹克日
2019年06月25日 全国土地日
2019年06月26日 国际禁毒日
2019年06月30日 世界青年联欢节
2019年07月01日 中国共产党诞生日
2019年07月01日 香港回归日
2019年07月02日 国际体育记者日
2019年07月06日 国际接吻日
2019年07月07日 抗日战争纪念日
查看更多节日