jq字符串插值中含特殊字符字段名的取值与格式转换问题
解决jq引用含特殊字符JSON字段的语法错误问题
场景说明
在Ubuntu的bash环境中使用jq 1.6处理如下格式的JSON日志:
{"@timestamp":"2024-02-28T10:21:51.939Z", "log.level":"info", "msg": "done"}
需要将其转换为以下文本格式:
2024-02-28T10:21:51.939Z - info - done
错误原因分析
之前执行命令时出现语法错误,核心原因有两个:
- shell引号转义错误:在单引号包裹的jq表达式中,错误地对双引号做了转义(如
[\"log.level\"])。bash中单引号内的所有字符会被原样解析,不需要转义双引号,多余的转义会导致jq无法识别表达式。 - 特殊字段引用方式错误:对于包含
@、.这类特殊字符的JSON字段,不能直接使用.@timestamp的点语法,必须采用."字段名"或.[字段名]的形式引用。
正确解决方案
1. 单独提取特殊字段的正确命令
- 提取
@timestamp字段:
msg='{"@timestamp":"2024-02-28T10:21:51.939Z", "log.level":"info", "msg": "done"}' echo "$msg" | jq -r '."@timestamp"'
输出:
2024-02-28T10:21:51.939Z
- 提取
log.level字段:
echo "$msg" | jq -r '."log.level"'
输出:
info
2. 最终格式化命令
将三个字段拼接成目标格式的完整命令:
echo "$msg" | jq -r '"\(."@timestamp") - \(."log.level") - \(.msg)"'
执行后直接输出目标文本:
2024-02-28T10:21:51.939Z - info - done
内容的提问来源于stack exchange,提问作者Jan DB
相关产品推荐
相关产品推荐

