【发布时间】:2015-04-15 02:02:35
【问题描述】:
我有一个包含多个未格式化的 json 消息的日志文件。 尝试编写一个 shell 脚本在日志中搜索字符串并格式化匹配的 json 并写入文件。
例如:- 在 test.log 文件中,
type_logfile 2015-04-14 18:06:15,284 信息响应日志服务- {"header":{"time":"2015 06:06:13 PM EDT","reqId":"1","user":"baskar"}}
type_logfile 2015-04-14 18:06:15,284 信息响应日志服务- {"header":{"time":"2015 06:06:13 PM EDT","reqId":"2","user":"raja"}}
type_logfile 2015-04-14 18:06:15,284 信息响应日志服务- {"header":{"time":"2015 06:06:13 PM EDT","reqId":"3","user":"baskar"}}
我使用下面的命令,
grep -i "baskar" test.log | grep -o "{\"header\".*" | python -m json.tool > ~/search_result.log
如果搜索仅返回一条 json 消息,则上述命令可以正常工作。如果有多个匹配,这不起作用并抛出以下错误。
无法解码 json 消息。
然而,如果我将匹配的输出重定向到某个文件,然后逐行读取文件以格式化 json 作品。
grep -i "baskar" test.log | grep -o "{\"header\".*" > ~/search_result.log
while read line
do
name=$line
echo $name | python -m json.tool >> ~/formatted_search_result.log
done < ~/search_result.log
因为,写入临时文件然后从临时文件中读取以格式化 json 会影响性能,因此需要寻找一些有效的方法。
预期的输出是, 当我搜索
grep -i "baskar" test.log
,
{
"header": {
"user": "baskar",
"reqId": "1",
"time": "2015 06:06:13 PM EDT"
}
}
{
"header": {
"user": "baskar",
"reqId": "3",
"time": "2015 06:06:13 PM EDT"
}
}
谢谢, 巴斯卡尔.S
【问题讨论】:
-
输出应该是什么样子的?
-
已经用他预期的输出更新了帖子。