使用 AWK 格式化 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式