有没有办法让jq在遇到错误后继续前进?

时间:2015-12-30 23:21:51

标签: jq

我使用jq来解析日志数据,有时日志包含格式错误的东西(无效的json),当发生这种情况时,jq会中止处理。

有没有办法让jq继续处理它可以,同时通过stderr报告问题?

据我所知,如果你的JSON中有换行符,如果它从下一行开始,jq可能有问题,但在这种情况下,你最终仍然会找到合法的json消息的开头并且可以继续处理。

2 个答案:

答案 0 :(得分:5)

使用jq-1.5,我能够做到以下几点:

# Include All Errors in output as a string
cat example.log | jq -R '. as $raw | try fromjson catch $raw'

# Skip all errors and keep going
cat example.log | jq -R 'fromjson?'

不是json的行将作为字符串输出,其他所有行都将是json

答案 1 :(得分:4)

如果您有jq 1.5,答案是:,但一般来说,预处理(例如使用hjson或any-json)会更好。

无论如何,这个想法只是利用try / catch功能。以下是使用inputs过滤器的插图。请注意,通常应使用-n选项调用jq,以使其正常工作。

recover.jq

def handle: inputs | [., "length is \(length)"] ;
def process: try handle catch ("Failed", process) ;
process

bad.json

[1,2,3]
{id=546456, userId=345345}
[4,5,6]

参见jq run:

$ jq -n -f recover.jq bad.json
[
  "[1,2,3]",
  "length is 3"
]
"Failed"
[
  "[4,5,6]",
  "length is 3"
]