我正在使用jq来解析我的一些日志,但由于各种原因无法解析某些日志行。有没有办法让jq忽略那些线?我似乎无法找到解决方案。我试图使用某些人推荐的--seq参数,但是--seq忽略了我文件中的所有行。
答案 0 :(得分:9)
假设每个日志条目恰好是一行,您可以使用-R
或--raw-input
选项告诉jq保留未解析的行,之后您可以将fromjson? |
添加到您的行中过滤使jq尝试将每一行解析为JSON并丢弃那些错误。
答案 1 :(得分:1)
FAQ page处理“无效JSON”主题有几个Q& As,但特别是Q:
有没有办法让jq在输入文件中遇到错误后继续运行?
特别是,这显示了如何使用--seq。
但是,根据你给出的稀疏细节(SO recommends给出了一个最小的例子),使用inputs
似乎更好。我们的想法是使用“try / catch”,例如
def handle: inputs | [., "length is \(length)"] ;
def process: try handle catch ("Failed", process) ;
process
在调用jq时不要忘记使用-n选项。
答案 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。