【问题标题】:Ignore Unparseable JSON with jq使用 jq 忽略不可解析的 JSON
【发布时间】:2017-05-26 17:48:29
【问题描述】:

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

【问题讨论】:

  • 问题不在于无法解析的个别行。这是关于忽略或绕过有问题的线路。想象有一行只有“123”。

标签: json unix logging error-handling jq


【解决方案1】:

这是一个旧线程,但这是另一个完全在jq 中的解决方案。这使您既可以处理正确的 json 行,也可以打印出非 json 行。

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

【讨论】:

    【解决方案2】:

    我有一些消息是 json 格式的日志流。 我想通过 jq 传递 json 消息,然后回显其余的。

    json 消息位于单行

    解决方案:使用 grep 和 tee 将行拆分为两个流,那些以“^{”开头的流通过 jq 管道,其余的只是回显到终端。

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

    cat logs | tee &gt;(grep -v "^{") | grep "^{" | jq .

    解释: tee 生成第二个流,并且 grep -v 打印非 json 信息,第二个 grep 只将看起来像 json 左括号的内容传递给 jq。

    【讨论】:

    • 这仅检查以 { 开头的行,这并不意味着它们是有效的 JSON。这条线怎么样:{{
    • @StevenRoose 是的,甚至 "{" 后跟非 json,但是对于日志解析,您要么有 json 行,要么有以日期开头的普通日志行,而不是大括号,并且过滤第一个字符就足以拆分流并仅通过 jq 传递 json 行。
    【解决方案3】:

    FAQ page 上有几个关于“无效 JSON”主题的 Q&A,但请特别查看 Q:

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

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

    但是,根据您提供的稀疏细节(SO recommends 给出了一个最小的示例),似乎最好简单地使用 inputs。这个想法是一次处理一个 JSON 实体,使用“try/catch”,例如

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

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

    另见Processing not-quite-valid JSON

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 哦,这很有趣。我会试一试。谢谢!
      • 成功了!非常感谢!
      • 我花了一段时间才明白,因为我不太了解 jq 但这只是我正在寻找从文件中删除一些不良记录。对于像我这样的其他人,一种使用方式是:cat file_to_clean.jsonl | jq -R "fromjson? | . " -c &gt; clean_file.jsonl
      • 如果你想将不可解析的行转换为字符串(就像我需要的那样),你可以在你的脚本前面加上(. as $line | try fromjson catch $line) |
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多