如何在 Shell 脚本中解析 json 并取出数据?

2021-12-17 15:18:48 +08:00
 LxnChan

有一段数据,需要在 shell 脚本中解析

{
  "access_token":"12345678-1234-1234-1234-123456789012",
  "token_type":"bearer",
  "refresh_token":"12345678-1234-1234-1234-12345678901"
}

需要获取access_tokenrefresh_token的值,但这两个值的长短不固定,请问大家有没有什么好方法能把这两个值从 json 中取出来并写入变量?

4138 次点击
所在节点    程序员
30 条回复
toaruScar
2021-12-17 15:22:24 +08:00
能用 jq 吗?
LxnChan
2021-12-17 15:30:04 +08:00
@toaruScar 我去看一下,不过说尽量不要用第三方库
d0m2o08
2021-12-17 15:35:09 +08:00
不用 jq 的话,用 awk 拼呗,jq 系统不一定自带,awk 肯定有
bfdh
2021-12-17 15:52:52 +08:00
最近我也在纠结这个,后来还是用了 jq 。确实不能用 jq 的话,就只有自己 awk 、sed 、cut 、grep 拼了,但是这种方式对复杂的 json 不好处理。这一点,还是 openwrt 方便,有现成的 shell 函数。
icepie
2021-12-17 16:15:01 +08:00
分享一个我用了很久的 awk 实现的 json 解析

https://fars.ee/4IFb

嵌套解析和列表会有点 bug... 不过满足轻度使用了
hutoer
2021-12-17 16:26:59 +08:00
grep 'access_token\|refresh_token' | awk -F ':|,' '{print $2}'
Martin9
2021-12-17 16:27:19 +08:00
sed 找到所需要的行,然后再 awk 按:为分隔符取第二列的值
ysc3839
2021-12-17 16:49:04 +08:00
不用第三方库的话只能用各种正则工具来匹配了
xuboying
2021-12-17 16:49:11 +08:00
不用 jq 或者 python 这种成熟的库,就意味着各种 so 上搜到的奇怪的 awk sed 语法复制粘贴了。然后是难以维护的一段 magic shell 脚本留给后人。
xujiabin
2021-12-17 16:55:24 +08:00
shell 中引用 python 的 json 库.....
xujiabin
2021-12-17 16:59:06 +08:00
echo '{
> "access_token":"12345678-1234-1234-1234-123456789012",
> "token_type":"bearer",
> "refresh_token":"12345678-1234-1234-1234-12345678901"
> }'|python -c "import json,sys;a=json.load(sys.stdin);print(a.get('access_token'))"
ch2
2021-12-17 17:12:55 +08:00
调一下 python 就行了
str='{"access_token":"12345678-1234-1234-1234-123456789012","token_type":"bearer","refresh_token":"12345678-1234-1234-1234-12345678901"}'
access_token=$(python -c "print(($str)['access_token'])")
echo $access_token
kidonng
2021-12-17 17:20:47 +08:00
需求有点怪,Shell 本来就胶水,不让用三方库有点又要马儿跑,又要马儿不吃草的感觉
如果有 Python ,像 10L 提到的用它解析也行
如果是觉得 jq 之类的包不方便装,可以用下面这两个 Go 写的单文件程序来解析
https://github.com/mikefarah/yq
https://github.com/TomWright/dasel
Kasumi20
2021-12-17 17:32:44 +08:00
正则表达式啊
Kasumi20
2021-12-17 17:36:15 +08:00
grep -e '"refresh_token":".*"'
fxxkgw
2021-12-17 17:41:34 +08:00
获取 access_token 可以用

echo '"access_token":"12345678-1234-1234-1234-123456789012","token_type":"bearer"' | grep -Po '"access_token":"[-\d]+' | grep -Po '[-\d]+'

后面类似 不过写这玩意真浪费生命浪费脑细胞。
jeepc
2021-12-17 17:52:24 +08:00
正则
xiaoz
2021-12-17 18:49:00 +08:00
可以看看之前这个 v 友分享的:https://www.v2ex.com/t/811831
hzjseasea
2021-12-17 19:05:29 +08:00
有解析 JQ 的 大佬们有没有拼接 JQ 的解决方法
之前试过只能自己拼 json 格式
mingl0280
2021-12-17 19:10:37 +08:00
egrep+正则,行了。
这有啥难度……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/822821

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX