我有一个日志文件,其中包含多条未格式化的json消息。 尝试编写shell脚本以在日志中搜索字符串并格式化匹配的json并写入文件。
例如: - 在test.log文件中,
type_logfile 2015-04-14 18:06:15,284 INFO ResponseLogService - {"标题":{"时间":" 2015年06:06:13 EDT"," reqId":" 1& #34;"用户":" baskar"}}
type_logfile 2015-04-14 18:06:15,284 INFO ResponseLogService - {"标题":{"时间":" 2015年06:06:13美国东部时间"," reqId":" 2& #34;"用户":"拉加"}}
type_logfile 2015-04-14 18:06:15,284 INFO ResponseLogService - {"标题":{"时间":" 2015年06:06:13美国东部时间"," reqId":" 3& #34;"用户":" 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&#34; baskar&#34; 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"
}
}
谢谢, Baskar.S
答案 0 :(得分:2)
使用jq
。给出您的示例文本:
sed 's/.*Service - //' file | jq -s .
如果您不想要一组对象,请删除-s
选项。
您可以将输入过滤为jq:
sed -n '/baskar/ s/.*Service - //p' file | jq .
或让jq过滤
sed 's/.*Service - //' file | jq 'select(.header.user == "baskar")'
任一选项都会产生
{
"header": {
"user": "baskar",
"reqId": "1",
"time": "2015 06:06:13 PM EDT"
}
}
{
"header": {
"user": "baskar",
"reqId": "3",
"time": "2015 06:06:13 PM EDT"
}
}