使用 awk 将 JSON 格式 Nginx 日志转换为 CSV - 简易指南
假设我们有以下的 nginx 日志文件,其中包含了 JSON 格式的数据:
{'time': '2022-01-01T00:00:00+08:00', 'ip': '192.168.0.1', 'method': 'GET', 'url': '/api/v1/user', 'status': 200, 'response_time': 0.1234}
{'time': '2022-01-01T00:01:00+08:00', 'ip': '192.168.0.2', 'method': 'POST', 'url': '/api/v1/user', 'status': 201, 'response_time': 0.2345}
{'time': '2022-01-01T00:02:00+08:00', 'ip': '192.168.0.3', 'method': 'GET', 'url': '/api/v1/product', 'status': 200, 'response_time': 0.3456}
我们需要将其转换成 CSV 格式,即:
time,ip,method,url,status,response_time
2022-01-01T00:00:00+08:00,192.168.0.1,GET,/api/v1/user,200,0.1234
2022-01-01T00:01:00+08:00,192.168.0.2,POST,/api/v1/user,201,0.2345
2022-01-01T00:02:00+08:00,192.168.0.3,GET,/api/v1/product,200,0.3456
我们可以使用 awk 命令来实现这个功能。具体步骤如下:
- 使用 awk 的 BEGIN 语句,初始化 CSV 表头:
awks 'BEGIN {print "time,ip,method,url,status,response_time"}'
- 使用 awk 的正则表达式,匹配每行的 JSON 字符串,并提取其中的字段:
awks -F'[{},:]+' '{print $2,$4,$6,$8,$10,$12}'
其中,-F 参数指定了分隔符,由于 JSON 格式中使用了大括号和冒号,我们可以使用正则表达式 '[{},:]+' 来作为分隔符。
- 将提取出来的字段使用逗号连接起来,并输出到 CSV 文件中:
awks -F'[{},:]+' '{print $2,$4,$6,$8,$10,$12}' | awks '{print $1","$2","$3","$4","$5","$6}'
完整的命令如下:
awks 'BEGIN {print "time,ip,method,url,status,response_time"} {print $0}' access.log | awks -F'[{},:]+' '{print $2,$4,$6,$8,$10,$12}' | awks '{print $1","$2","$3","$4","$5","$6}' > access.csv
其中,access.log 是原始的 nginx 日志文件,access.csv 是转换后的 CSV 文件。
原文地址: https://www.cveoy.top/t/topic/msSO 著作权归作者所有。请勿转载和采集!