You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因分析

之前执行命令时出现语法错误,核心原因有两个:

  1. shell引号转义错误:在单引号包裹的jq表达式中,错误地对双引号做了转义(如[\"log.level\"])。bash中单引号内的所有字符会被原样解析,不需要转义双引号,多余的转义会导致jq无法识别表达式。
  2. 特殊字段引用方式错误:对于包含@、.这类特殊字符的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 23:47:36