unix shell脚本 - 搜索字符串并格式化为json

时间:2015-04-15 02:02:35

标签: json shell unix

我有一个日志文件,其中包含多条未格式化的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

1 个答案:

答案 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"
  }
}