假设我们有以下的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命令来实现这个功能。具体步骤如下:

  1. 使用awk的BEGIN语句,初始化CSV表头:
awk 'BEGIN {print "time,ip,method,url,status,response_time"}'
  1. 使用awk的正则表达式,匹配每行的JSON字符串,并提取其中的字段:
awk -F'[{},:]+' '{print $2,$4,$6,$8,$10,$12}'

其中,-F参数指定了分隔符,由于JSON格式中使用了大括号和冒号,我们可以使用正则表达式[{},:]+来作为分隔符。

  1. 将提取出来的字段使用逗号连接起来,并输出到CSV文件中:
awk -F'[{},:]+' '{print $2,$4,$6,$8,$10,$12}' | awk '{print $1","$2","$3","$4","$5","$6}'

完整的命令如下:

awk 'BEGIN {print "time,ip,method,url,status,response_time"} {print $0}' access.log | awk -F'[{},:]+' '{print $2,$4,$6,$8,$10,$12}' | awk '{print $1","$2","$3","$4","$5","$6}' > access.csv

其中,access.log是原始的nginx日志文件,access.csv是转换后的CSV文件。

如何使用awk的正则将json格式nginx日志转成csv

原文地址: https://www.cveoy.top/t/topic/5zV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录