【问题标题】:jq: How to slurp mid-filter (convert separate json objects to an array)jq:如何 slurp 中间过滤器(将单独的 json 对象转换为数组)
【发布时间】:2022-11-10 04:35:16
【问题描述】:

我正在解析看起来像的弹性日志

$ cat my_log_file.txt:
{"level": "INFO", "message": "foo"}
{"level": "WARN", "message": "bar"}
{"level": "WARN", "message": "baz"}

因为它们是每行一个,所以以前我使用jq -s 将它们放入一个可以运行map 的实际数组中:

jq -s 'map(.message) | unique' my_log_file.txt

现在我想只选择具有级别!=“INFO”的行。我应该可以只使用this cookbook recipe,但jq 再次遇到麻烦,因为每一行都是单独的对象而不是数组。

我不能使用 slurp,因为它不适用于以下命令:

jq 'select(."level" != "INFO")' my_log_file.txt

但是当我想再次映射到 .message 时,我得到了与之前不使用 slurp 时相同的错误:

$ jq 'select(."level" != "INFO") | map(.message) | unique' my_log_file.txt
jq: error (at <stdin>:90): Cannot index string with string "message"

如何在中途转换我的记录 - 选择完成后,将结果从

{"level": "WARN", "message": "bar"}
{"level": "WARN", "message": "bar"}

[
  {"level": "WARN", "message": "bar"},
  {"level": "WARN", "message": "bar"}
]

我听说inputs 是用来代替 slurp 的,但是当我尝试

$ jq 'select(."level" != "INFO") | [inputs]' my_log_file.txt

这忽略了我的select,我又得到了每条消息的列表。

【问题讨论】:

    标签: jq


    【解决方案1】:

    在形成数组时进行选择的有效方法是使用带有 -n 命令行选项的inputs,如下所示:

    jq -n '[inputs | select(."level" != "INFO") ]' my_log_file.txt
    

    【讨论】:

      【解决方案2】:

      我不能使用 slurp,因为它不适用于此命令

      那是因为 select 在数组上工作,您需要将 select 包装在 map() 中以使其工作:

      jq -s 'map(select(.level != "INFO"))' my_log_file.txt
      

      因此,要获取所有message 其中level != "INFO",您可以使用:

      jq -s 'map(select(.level != "INFO").message)' my_log_file.txt
      

      【讨论】:

        猜你喜欢
        • 2016-12-24
        • 1970-01-01
        • 1970-01-01
        • 2022-10-07
        • 2023-01-24
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多