簡體   English   中英

在原始 JSON 行中使用值映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM