使用 AWK 格式化 Nginx 日志

更新日期: 2019-05-25 阅读次数: 702 字数: 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年08月23日 处暑
2019年09月03日 抗日胜利纪念日
2019年09月08日 白露
2019年09月08日 国际扫盲日
2019年09月10日 教师节
2019年09月13日 中秋节
2019年09月16日 国际臭氧层保护日
2019年09月16日 世界清洁地球日
2019年09月18日 "九一八"事变纪念日
2019年09月20日 国际爱牙日
2019年09月21日 国际和平日
2019年09月22日 世界无车日
查看更多节日