我有一个包含如下条目的日志文件:
{"@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
好的,我解决了我自己的问题。与手册相反,您不必转义引号。
$ echo $msg | jq -r '"\(.["@timestamp"])"'
2024-02-28T10:21:51.939Z
$ echo $msg | jq -r '"\(.["log.level"])"'
info
这里有一些方法:
# 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(" - ")'