我正在尝试使用 make s curl 调用编写一个 bash 脚本并获取一个 json 文档。 json 文档有一个名为 的键access_token
,我需要提取该字段的值。这是我的 json 文档
echo $json
{"access_token":"kjdshfsd", "key2":"value"}
我没有jq
安装过。
答案1
简短的回答:安装jq
如果没有 json 解析器,你就不应该解析 json。
为此,请执行以下操作jq
:
echo "$json" | jq -r '.access_token'
或者,不让echo
展开编码的选项卡和换行符,
jq -r -n --argjson data "$json" '$data.access_token'
我首选的 json 解析器是json,使用它你可以这样做:
echo "$json" | json access_token
笔记:这两个解决方案都假设您的 json 对象与您在示例中所示的完全相同(或至少几乎完全相同)。
答案2
不jq
,awk
,sed
:
#!/bin/bash
json='{"access_token":"kjdshfsd", "key2":"value"}'
echo $json | grep -o '"access_token":"[^"]*' | grep -o '[^"]*$'
在这里测试和工作: https://ideone.com/Fw4How
答案3
如果您无法安装 json 解析器,那么假设您的字符串不能包含双引号或换行符,每个记录都在一行上,并且每个标签和值都是双引号括起来的字符串,如您发布的示例输入中所示,这将起作用在每个 UNIX 机器上的任何 shell 中使用任何 awk:
$ cat tst.awk
{
while ( match($0,/"[^"]*"/) ) {
hit = substr($0,RSTART+1,RLENGTH-2)
if ( ++cnt % 2 ) {
tag = hit
}
else {
val = hit
f[tag] = val
}
$0 = substr($0,RSTART+RLENGTH)
}
print f[tgt]
}
$ echo "$json" | awk -v tgt='access_token' -f tst.awk
kjdshfsd
$ echo "$json" | awk -v tgt='key2' -f tst.awk
value
答案4
作为 的替代选项jq
,miller ( mlr
) 的最新版本支持 JSON 输入,只要它表示表格数据,就像您的仅包含标量值的 JSON 对象的情况一样,就像表中的一行一样。
printf %s "$json" | mlr --j2n cut -f access_token
mlr
具有不重新格式化值的优点(或缺点取决于 PoV)。比如1e1
或者10.00000000000000001
不会成为10
。