【发布时间】: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第一次看到其中一个时会出错,但使用-R和fromjson?会忽略这些行。 -
@hobbs - 你说什么?当然是真的,但我是按照 OP 写的:
raw lines of JSON objects。 -
@peak 是的,也许我假设的事情比现在更复杂。不过,这是我可以想象自己需要的东西:)