使用jq忽略Unparseable JSON

时间:2017-01-11 19:37:17

标签: json unix logging error-handling jq

我正在使用jq来解析我的一些日志,但由于各种原因无法解析某些日志行。有没有办法让jq忽略那些线?我似乎无法找到解决方案。我试图使用某些人推荐的--seq参数,但是--seq忽略了我文件中的所有行。

3 个答案:

答案 0 :(得分:9)

假设每个日志条目恰好是一行,您可以使用-R--raw-input选项告诉jq保留未解析的行,之后您可以将fromjson? |添加到您的行中过滤使jq尝试将每一行解析为JSON并丢弃那些错误。

答案 1 :(得分:1)

FAQ page处理“无效JSON”主题有几个Q& As,但特别是Q:

  

有没有办法让jq在输入文件中遇到错误后继续运行?

特别是,这显示了如何使用--seq。

但是,根据你给出的稀疏细节(SO recommends给出了一个最小的例子),使用inputs似乎更好。我们的想法是使用“try / catch”,例如

,一次处理一个JSON实体
def handle: inputs | [., "length is \(length)"] ;
def process: try handle catch ("Failed", process) ;
process  

在调用jq时不要忘记使用-n选项。

另见Processing not-quite-valid JSON

答案 2 :(得分:0)

我有json格式的日志消息,我想通过jq进行传递,但是它们之间存在纯文本错误日志。

解决方案::使用grep从其余位置拆分以“ ^ {”开头的行。

kubectl logs -f web-svjkn | tee >(grep -v "^{") | grep "^{" | jq .

cat logs | tee >(grep -v "^{") | grep "^{" | jq .

说明: tee生成第二个流,并且grep -v打印非json信息,第二个grep仅将类似于json左括号的管道传送到jq。