Linux如何在Shell中处理JSON_Linux Shell中处理JSON详解

穿越時空

穿越時空

2026-05-24

740人浏览

原创

jq 是唯一靠谱的默认选择,因其将 json 当作数据结构而非文本处理,能正确解析引号转义、嵌套、null 等,错误时明确报错而非静默失败。

linux如何在shell中处理json_linux shell中处理json详解

Shell 本身不支持原生 JSON 解析,硬用 grep/sed/awk 提取字段极易出错——尤其当值含引号、换行、嵌套或逗号时,grep '"key":' 会直接漏掉多行结构或匹配到注释/字符串内部。

为什么 jq 是唯一靠谱的默认选择

它把 JSON 当成数据结构处理,而不是文本流。所有其他方法(比如正则“抠”字符串)在真实运维场景中都属于临时补丁,不是解决方案。

  • jq 能正确识别 JSON 的语法边界:引号转义、数组索引、对象嵌套、null 值、布尔字面量,都不需要你手动判断
  • 错误输入会直接报错退出(如 parse error: Invalid numeric literal),而不是静默返回垃圾结果
  • 支持管道链式处理:curl -s "$API" | jq -r '.data[].id' | head -n 1 这种写法稳定可读
  • 输出控制灵活:-r 去掉外层引号,-c 强制单行,--arg 安全传入 Shell 变量

jq 提取字段时最常踩的三个坑

新手常以为写对了路径就万事大吉,但实际运行时卡住,往往是因为:

php版微信js-sdk支付接口类
php版微信js-sdk支付接口类

php版微信js-sdk支付接口类

下载
  • 字段名带点或连字符?必须用括号和引号:.["user.name"].["content-type"],不能写 .user.name(会被当成两层嵌套)
  • 数组为空或字段不存在?默认返回 nulljq '.items[0].name'"items": [] 时输出 null,不是空字符串;加 // empty 或用 try ... catch 捕获
  • 原始数据是多行 JSON 流(如 curl 流式响应)?默认只处理第一个 JSON 对象;加 -s(slurp)或用 inputs 逐个处理

不用 jq 时怎么勉强应付单层 JSON

仅限你完全控制输入格式、且确认 JSON 永远是单行、无嵌套、无转义引号的极简场景(例如生成的配置片段)。

  • tr 把换行干掉:tr '\n' ' '
  • 再用 sed 提取键值:sed -n 's/.*"timeout":[[:space:]]*\([^[:space:],}]*\).*/\1/p'
  • 但注意:\([^[:space:],}]*\) 假设值里不含逗号、花括号、空格——一旦 API 返回 "timeout": "30s",这个正则就失效
  • 更安全一点的做法是先用 jq -c '.' 把任意 JSON 压成单行,再交给文本工具——等于绕一圈又回到 jq

从 curl 获取 JSON 后直接进变量,别用 cat + 文件中转

很多人习惯先 curl -o tmp.jsonjq '.x' tmp.json,其实没必要,还多一个磁盘 I/O 和清理负担。

  • 直接管道:result=$(curl -s "https://api.example.com/status" | jq -r '.status')
  • 如果要多次提取不同字段,避免重复请求:json=$(curl -s "$URL"),然后 jq -r '.a'
  • 注意双引号包裹变量:jq -r --arg url "$API_URL" '.url = $url' ,否则变量内容会被 shell 展开或截断
  • 别用 echo $json | jq——未加引号的 $json 会破坏换行和空格,导致解析失败

真正难的从来不是“怎么写一行命令”,而是“怎么让这行命令在下周、在另一台机器、在 JSON 格式微调后还能跑通”。jq 的表达式可能看起来像密码,但它把不确定性锁死了;而 sed 正则越写越长,越改越不敢动。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js linux json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

1808

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

888

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1151

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

7862

11

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

637

4

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1190

5

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1051

5

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

2023.09.21

1902

3

js生成随机数方法
js生成随机数方法

JavaScript生成随机数的方法,包括使用Math.random()方法生成指定范围内的随机整数、生成随机字符串和生成随机颜色。根据具体需求,可以选择适合的方法来生成随机数,以实现各种功能 。

2023.09.25

938

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Apifox下载与安装手册
Apifox下载与安装手册

共0课时 | 0人学习

安装 Xdebug 并配置 phpstorm
安装 Xdebug 并配置 phpstorm

共1课时 | 125人学习