使用 AWK 格式化 Nginx 日志

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

相关文章

爱评论不评论

近期节日

2020年02月28日 世界居住条件调查日
2020年03月01日 国际海豹日
2020年03月03日 全国爱耳日
2020年03月05日 学雷锋日
2020年03月05日 惊蛰
2020年03月08日 三八妇女节
2020年03月12日 植树节
2020年03月14日 白色情人节
2020年03月15日 消费者权益日
2020年03月17日 国际航海日
2020年03月20日 世界无肉日
2020年03月20日 春分
查看更多节日