我有一个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提取值。任何帮助将不胜感激。
答案 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')