使用 AWK 格式化 Nginx 日志

更新日期: 2019-05-25 阅读次数: 3289 字数: 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 聊聊。 白天工地搬砖,晚上哄熊孩子,可能回复有点慢,见谅。 查看更多联系方式

相关文章

爱评论不评论

近期节日

2019年11月29日 黑色星期五
2019年12月01日 世界艾滋病日
2019年12月03日 国际残疾人日
2019年12月07日 大雪
2019年12月09日 "一二九"运动纪念日
2019年12月09日 世界足球日
2019年12月10日 世界人权日
2019年12月12日 西安事变纪念日
2019年12月13日 南京大屠杀
2019年12月20日 澳门回归日
2019年12月21日 国际篮球日
2019年12月22日 冬至
查看更多节日