【问题标题】:Use value mapping in raw JSON lines在原始 JSON 行中使用值映射
【发布时间】:2021-08-19 13:06:45
【问题描述】:

当输入为 JSON 数组时,可以使用 map 转换元素属性的值,例如在此答案中:https://stackoverflow.com/a/45887356/1226020

但在我的例子中,我有 JSON 对象的原始行作为输入,而不是 JSON 数组,我想转换每个对象中的值。

示例输入

{"level": 20, "msg": "Debug message"}
{"level": 30, "msg": "Info message"}
{"level": 30, "msg": "Info message"}
{"level": 40, "msg": "Warn message"}
{"level": 20, "msg": "Debug message"}

我目前这样做:

cat test.log  | jq -rR 'fromjson? | "[\(.level)] \(.msg)"'

这给出了这个:

[20] Debug message
[30] Info message
[30] Info message
[40] Warn message
[20] Debug message

经过一些转换等后所需的输出:

[debug] Debug message
[info] Info message
[info] Info message
[warn] Warn message
[debug] Debug message

是否可以在 JQ 中像这样转换“枚举”值?

【问题讨论】:

  • 虽然您确实可以将输入视为“原始”文本,但它可以(并且可能应该)被视为 JSON 文本流,可以由 jq 处理,例如使用带有 -n 命令行选项的 inputs
  • @peak 我认为这里的想法是日志可能是“脏的”并且包含一些不是格式良好的 JSON 的行。 inputs 第一次看到其中一个时会出错,但使用 -Rfromjson? 会忽略这些行。
  • @hobbs - 你说什么?当然是真的,但我是按照 OP 写的:raw lines of JSON objects
  • @peak 是的,也许我假设的事情比现在更复杂。不过,这是我可以想象自己需要的东西:)

标签: json jq logfile recode


【解决方案1】:

当然,您可以使用 as 预先声明一个映射对象,然后再使用它:

jq -rR '{"20": "debug", "30": "info", "40": "warn"} as $levelmap
    | fromjson? | "[\($levelmap[.level | tostring])] \(.msg)"'

【讨论】:

    【解决方案2】:

    您仍然可以使用inputs 表达式并生成所需的输出

    jq -nr 'inputs | (.msg | split(" ")) as $m | "[\($m[0] | ascii_downcase))] \(.msg)"'
    

    或者如果.msg 的内容只是一个抽象,而你想要做一个日志级别的映射,你可以这样做

    jq -nr --argjson levelMap '{"20": "debug", "30": "info", "40": "warn"}' 'inputs 
         | "[\($levelMap[.level | tostring])] \(.msg)"'
    

    【讨论】:

      【解决方案3】:

      由于输入是 JSON 流,那么只要 .level 到 .msg 的第一个单词的映射是一致的,就可以:

      < test.log 'jq -sr '
       . as $in
       | INDEX($in[]; .level|tostring)  as $dict
       | ($dict | map_values( . = (.msg | ascii_downcase | sub(" .*";"")))) as $kw
       | $in[]
       | .level |= $kw[tostring]
       | "[\(.level)] \(.msg)"
      '
      

      【讨论】:

      • 我不认为该消息实际上是Debug message
      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2018-04-30
      • 2021-03-14
      • 2016-06-12
      • 1970-01-01
      相关资源
      最近更新 更多