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

在无jq等工具的Bash 3.x环境下提取JSON指定字段值

提取JSON中特定字段的值(Bash 3.x,无jq)

既然你受限于Bash 3.x环境,还不能用jq这类工具,咱们就用系统自带的基础文本处理工具来搞定这个需求,以下是两种可行的实现方法:

方法一:grep + sed 组合

如果你的JSON数据保存在文件里(比如health_check.json),可以用这条命令:

grep -A 5 '"JMSHealthCheck"' health_check.json | grep '"pendingCount"' | sed 's/.*"pendingCount": *\([0-9]*\).*/\1/'

如果数据是存放在变量中(比如json_data),可以改成:

echo "$json_data" | grep -A 5 '"JMSHealthCheck"' | grep '"pendingCount"' | sed 's/.*"pendingCount": *\([0-9]*\).*/\1/'

各部分作用解释:

  • grep -A 5 '"JMSHealthCheck"':匹配到包含"JMSHealthCheck"的行,并输出该行及后面5行(足够覆盖producerTemplate的内容)
  • grep '"pendingCount"':在上一步的结果中筛选出包含pendingCount的行
  • sed 's/.*"pendingCount": *\([0-9]*\).*/\1/':用正则表达式替换,提取出pendingCount后面的数字(自动忽略前后的空格和其他无关字符)

方法二:awk 处理(更稳健)

如果JSON的换行格式可能有变动,awk的方法能更好地定位JMSHealthCheck的区块,避免因行数变化导致提取失败:

awk '/"JMSHealthCheck"/ {flag=1} flag && /"pendingCount"/ {print gensub(/.*"pendingCount": *([0-9]+).*/, "\\1", "g"); exit} /}/ {flag=0}' health_check.json

变量版本:

echo "$json_data" | awk '/"JMSHealthCheck"/ {flag=1} flag && /"pendingCount"/ {print gensub(/.*"pendingCount": *([0-9]+).*/, "\\1", "g"); exit} /}/ {flag=0}'

各部分作用解释:

  • /\"JMSHealthCheck\"/ {flag=1}:匹配到"JMSHealthCheck"时,标记开始关注后续内容
  • flag && /\"pendingCount\"/ {print gensub(...); exit}:当处于JMSHealthCheck区块内且匹配到pendingCount时,提取数字并立即退出(避免处理其他可能存在的同名字段)
  • /}/ {flag=0}:遇到闭合大括号时,标记结束JMSHealthCheck区块的处理

注意:这些方法依赖于JSON的基础结构,针对你提供的JSON数据,两种方法都能正常提取出pendingCount的值(也就是0);如果后续JSON格式有较大变动(比如被压缩成单行),可能需要微调正则表达式。

内容的提问来源于stack exchange,提问作者virendrao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:07:31