使用 AWK 格式化 Nginx 日志

更新日期: 2019-05-25 阅读次数: 8088 字数: 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

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式