使用jq忽略Unparseable JSON

Bra*_*don 7 unix error-handling logging json jq

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

Cri*_*sti 17

这是一个旧线程,但这是另一个完全在jq. 这允许您处理正确的 json 行并打印出非 json 行:

jq -R '. as $line | try (fromjson) catch $line'
Run Code Online (Sandbox Code Playgroud)

如果需要进行额外的jq处理:

jq -R . as $line | try (fromjson | <further processing for proper json lines>) catch $line'
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了。对其进行了一些调整,以便在简单的复制/粘贴后即可完全运行:“jq -R”。作为 $line | 尝试 (fromjson) catch $line'` (4认同)

Pie*_*ter 14

我有日志流,其中一些消息采用 json 格式。我想通过 jq 通过管道传输 json 消息,然后回显其余部分。

json 消息位于一行

解决方案:使用 grep 和 tee 将行分成两个流,以“^{”开头的行通过 jq 进行管道传输,其余的仅回显到终端。

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

或者

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

解释: tee 生成第二个流,grep -v 打印非 json 信息,第二个 grep 仅将看起来像 json 左括号的内容通过管道传输给 jq。

  • @StevenRoose是的,甚至“{”后跟非json,但是对于日志解析,您要么有json行,要么有以日期开头的普通日志行,而不是大括号,并且对第一个字符的过滤足以拆分通过 jq 流式传输并仅传递 json 行。 (2认同)

jwo*_*der 12

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

  • 如果您想将无法解析的行转换为字符串(就像我需要的那样),您可以在脚本前面加上`(.as $line | try fromjson catch $line) |`。 (7认同)
  • 我花了一段时间才理解,因为我不太了解 jq,但这只是我想要从文件中删除一些坏记录。对于像我这样的人来说,使用方法是:```cat file_to_clean.jsonl | jq -R "fromjson? | . " -c &gt; clean_file.jsonl``` (4认同)
  • 我发现`tail -f log | jq -R 'try fromjson catch .'` 对于大多数情况来说足够了 (3认同)