如何在bash脚本中查找json中的键值对的值

如何在bash脚本中查找json中的键值对的值

我正在尝试使用 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

jqawksed

#!/bin/bash
json='{"access_token":"kjdshfsd", "key2":"value"}' 
    
echo $json | grep -o '"access_token":"[^"]*' | grep -o '[^"]*$'

在这里测试和工作: https://ideone.com/Fw4How

来源:https://brianchildress.co/parse-json-using-grep

答案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

相关内容