格式化awk输出以类似于JSON对象

时间:2019-08-01 00:52:03

标签: json linux bash apache awk

我正在尝试获取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周围还有一组引号。

0 个答案:

没有答案