jq字符串插值中带有特殊字符的字段名

问题描述 投票:0回答:2

我有一个包含如下条目的日志文件:

{"@timestamp":"2024-02-28T10:21:51.939Z", "log.level":"info", "msg": "done"}

我想把这个json转换成这样的东西:

2024-02-28T10:21:51.939Z - info - done

这是我从 shell 命令获得的输出:

$ msg='{"@timestamp":"2024-02-28T10:21:51.939Z", "log.level":"info", "msg": "done"}'

$ echo $msg | jq -r '"\(.[\"log.level\"])"'
jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?) at <top-level>, line 1:
"\(.[\"log.level\"])"     
jq: 1 compile error

$ echo $msg | jq -r '"\(.msg)"'
done

$ echo $msg | jq -r '"\(.[\"@timestamp\"])"'
jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?) at <top-level>, line 1:
"\(.[\"@timestamp\"])"     
jq: 1 compile error

$ echo $msg | jq -r '"\(.@timestamp)"'
jq: error: syntax error, unexpected QQSTRING_INTERP_END, expecting QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
"\(.@timestamp)"              
jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:
"\(.@timestamp)"   
jq: 2 compile errors

我在 Ubuntu 上使用 bash。 jq-1.6

json jq
2个回答
0
投票

好的,我解决了我自己的问题。与手册相反,您不必转义引号。

$ echo $msg | jq -r '"\(.["@timestamp"])"'
2024-02-28T10:21:51.939Z

$ echo $msg | jq -r '"\(.["log.level"])"'
info

0
投票

这里有一些方法:

# if you don't like working with blackslashes
echo $msg | jq -r '[.["@timestamp","log.level","msg"]]|join(" - ")'         

# if you want all the values (which in your case you do)
echo $msg | jq -r 'values|join(" - ")'

# to_entries if you want to manipulate value
echo $msg | jq -r 'to_entries|map(.value)|join(" - ")'
echo $msg | jq -r 'to_entries|map(.value|ascii_upcase)|join(" - ")'
© www.soinside.com 2019 - 2024. All rights reserved.