阅读JSON文件&解析以获取shell脚本中的元素值

时间:2015-11-05 14:08:56

标签: json shell

我有一个json文件名test.json,内容如下。

{
        "run_list": ["recipe[cookbook-ics-op::setup_server]"],
    "props": {
        "install_home": "/test/inst1",
            "tmp_dir": "/test/inst1/tmp",
        "user": "tuser
                 }
}

我想将这个文件读入shell脚本中的变量&然后提取install_home,user&的值。 tmp_dir使用expr。有人可以帮忙吗?

道具= cat test.json

用于将json文件转换为变量。现在我如何使用expr提取值。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

jq 是 JSON 文件的专用解析器。安装 jq。

json 中的值可以检索为:

jq .<top-level-attr>.<next-level-attr> <json-file-path>

如果 JSON 包含数组

jq .<top-level-attr>.<next-level-array>[].<elem-in-array> <json-file-path>

如果你想要一个 shell 变量中的值

id = $(jq -r .<top-level-attr>.<next-level-array>[].<next-level-attr> <json-file-path>)

echo id

如果需要不带引号的值,请使用 -r

答案 1 :(得分:1)

对于纯粹的bash解决方案,我建议: github.com/dominictarr/JSON.sh
它可以像这样使用:

./json.sh -l -p < example.json  

打印输出如:

["name"]        "JSON.sh"
["version"]     "0.2.1"
["description"] "JSON parser written in bash"
["homepage"]    "http://github.com/dominictarr/JSON.sh"
["repository","type"]   "git"
["repository","url"]    "https://github.com/dominictarr/JSON.sh.git"
["bin","JSON.sh"]       "./JSON.sh"
["author"]      "Dominic Tarr <dominic.tarr@gmail.com> (http://bit.ly/dominictarr)"
["scripts","test"]      "./all-tests.sh"

从这里开始,你正在寻找的是非常微不足道的

答案 2 :(得分:0)

让我们忽略输入文件是JSON文件的事实。如果您只是将其视为输入文本文件,我们只对以下几行感兴趣:

    "install_home": "/test/inst1",
        "tmp_dir": "/test/inst1/tmp",
    "user": "tuser"

一般而言,模式是:

  • "key" : "value"

我们可以将sed与正则表达式一起使用:

  • "key"针对每个案例"install_home""tmp_dir""user"
  • 进行了硬编码
  • "value"(.*)

然后我们可以使用\1来检索匹配的组。 ;t;d命令的sed部分将丢弃不匹配的行。

i=$(cat test.json | sed 's/.*"install_home": "\(.*\)".*/\1/;t;d')
t=$(cat test.json | sed 's/.*"tmp_dir": "\(.*\)".*/\1/;t;d')
u=$(cat test.json | sed 's/.*"user": "\(.*\)".*/\1/;t;d')

cat <<EOF
install_home: $i
tmp_dir     : $t
user        : $u
EOF

哪个输出:

install_home: /test/inst1
tmp_dir     : /test/inst1/tmp
user        : tuser

答案 3 :(得分:0)

安装jq

yum -y install epel-release
yum -y install jq

通过以下方式获取值

install_home=$(cat test.json  | jq -r '.props.install_home')
tmp_dir=$(cat test.json  | jq -r '.props.tmp_dir')
user=$(cat test.json  | jq -r '.props.user')