我正在尝试获取awk命令的输出以将其格式化为JSON。我对awk或regex没有太多经验,无法正确格式化。该脚本通过跟踪访问日志并使用awk解析出我想要的数据来从Apache提取原始数据。
我花了大约一个小时的时间来搜索和尝试各种格式。我目前拥有的最佳设置是以下代码。
awk:
awk -F " " '{
print "{\"ipAddr\":\"" $1 "\",\"reqType\":\"" $4 "\",\"reqItem\":\"" $5
"\",\"reqStatus\":\"" $7 "\",\"reqUrl\":\"" $8 "\"}"
}' temp1.log >> hmReq.log;
我当前得到的输出是:
{"{\"ipAddr\":\"my.ip.Addr\",
\"reqType\":\"GET\",
\"reqItem\":\"/contact\",
\"reqStatus\":\"200\",
\"reqUrl\":\"\"https://www.example.com/\"\"}":""}
我正试图使它像这样:
{
"ipAddr":"123.456.789.0",
"reqType":"GET",
"reqItem":"/contact",
"reqStatus":"200",
"reqUrl":"www.com"
}
非常感谢您的帮助!
编辑: 这是整个脚本:
inotifywait -m ~/hmLogs/a2access.log -e modify | while read path action file; do
cd ~/hmLogs
tail -n1 a2access.log >> temp1.log;
awk -F " " '{
print "{\"ipAddr\":\"" $1 "\",\"reqType\":\"" $4 "\",\"reqItem\":\""
$5 "\",\"reqStatus\":\"" $7 "\",\"reqUrl\":\""
$8 "\"}"}' temp1.log >> hmReq.log;
curl -s -w "\n" -d @hmReq.log -X POST http://localhost:8080/logs >> hmRes.log;
rm hmReq.log;
rm temp1.log;
cd -;
done;
从apache2 / access.log输入的原始数据样本:
161.69.99.11 [01/Aug/2019:03:59:35 +0000] GET /static/js/2.59e222c7.chunk.js HTTP/1.1 200 "https://www.tjbrackett.com/"
从字面上看,我是第一个Linux脚本,所以我确定自己做错了。
编辑2: 这是awk之前和之后temp1.log的内容。 之前:
76.20.106.208 [01/Aug/2019:17:08:40 +0000] GET /static/media/rock.1bacda84.jpg HTTP/1.1 200 "https://www.tjbrackett.com/about"
之后:
76.20.106.208 [01/Aug/2019:17:08:40 +0000] GET /static/media/rock.1bacda84.jpg HTTP/1.1 200 "https://www.tjbrackett.com/about"
编辑3: 看来输出是正确的,但无论出于何种原因,Express应用程序的响应都很奇怪。另外,现在唯一的问题是URL周围还有一组引号。