[英]Use value mapping in raw JSON lines
當輸入是 JSON 數組時,可以使用map
來轉換元素屬性的值,例如在這個答案中: https://stackoverflow.com/a/45887356/1226020 。
但在我的例子中,我有 JSON 個對象的原始行作為輸入,而不是 JSON 數組,我想轉換每個 object 中的值。
示例輸入
{"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
所需的 output,經過一些轉換等:
[debug] Debug message
[info] Info message
[info] Info message
[warn] Warn message
[debug] Debug message
是否有可能在 JQ 中像這樣轉換“枚舉”值?
當然,您可以只使用as
預先聲明一個映射 object ,然后再使用它:
jq -rR '{"20": "debug", "30": "info", "40": "warn"} as $levelmap
| fromjson? | "[\($levelmap[.level | tostring])] \(.msg)"'
您仍然可以使用inputs
表達式並生成所需的 output
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)"'
由於輸入是 JSON stream,那么只要映射 from.level 到 the.msg 的第一個單詞是一致的,你就可以 go :
< 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)"
'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.