如何使用Shell脚本在JSON响应跟踪文件中查找键的值

时间:2019-07-23 05:30:16

标签: json bash shell

我有一个包含以下响应的响应跟踪文件:

#RESPONSE BODY 
#--------------------
{"totalItems":1,"member":[{"name":"name","title":"PatchedT","description":"My des_","id":"70EA96FB313349279EB089BA9DE2EC3B","type":"Product","modified":"2019 Jul 23 10:22:15","created":"2019 Jul 23 10:21:54",}]}

我需要在一个变量中获取“ id”键的值,然后将其放入我的后续代码中。

预期结果是 echo $id-应该给我70EA96FB313349279EB089BA9DE2EC3B的价值

4 个答案:

答案 0 :(得分:3)

使用有效的JSON(使用this删除第一行和第二行,并使用db.users.find({ 'final_score': { '$lte': '60 + this.max_score', '$gte': '60 - this.min_score' } }) 进行解析):

sed

输出到变量ID:

70EA96FB313349279EB089BA9DE2EC3B

答案 1 :(得分:1)

我强烈建议使用jq来解析json。 但是,鉴于json与python字典和数组大部分兼容,因此该HACK也会起作用:

$ cat resp
#RESPONSE BODY 
#--------------------
{"totalItems":1,"member":[{"name":"name","title":"PatchedT","description":"My des_","id":"70EA96FB313349279EB089BA9DE2EC3B","type":"Product","modified":"2019 Jul 23 10:22:15","created":"2019 Jul 23 10:21:54",}]}

$ awk 'NR==3{print "a="$0;print "print a[\"member\"][0][\"id\"]"}' resp | python
70EA96FB313349279EB089BA9DE2EC3B
$ sed -n '3s|.*|a=\0\nprint a["member"][0]["id"]|p' resp | python
70EA96FB313349279EB089BA9DE2EC3B

请注意,此代码是
1.肮脏的骇客,因为您的系统没有正确的工具-jq
2.容易受到外壳注射攻击。因此,仅当您信任从您的服务收到的响应时,才使用它。

答案 2 :(得分:0)

又快又脏(don't use eval):

eval $(cat response_file | tail -1 | awk -F , '{ print $5 }' | sed -e 's/"//g' -e 's/:/=/')

它基于您给出的 exact 结构,希望在,之前的任何值中都没有"id"

或者自己分配:

id=$(cat response_file | tail -1 | awk -F , '{ print $5 }' | cut -d: -f2 | sed -e 's/"//g')

请注意,您不能使用该技巧来访问name字段,因为它是member数组的第一项,将被{ print $2 }“吞噬”。您可以使用更骇人听闻的hack来检索它:

id=$(cat response_file | tail -1 | sed -e 's/:\[/,/g' -e 's/\]//g' | awk -F , '{ print $5 }' | cut -d: -f2 | sed -e 's/"//g')

但是,如果可以的话,jq是完成该工作的正确工具,而不是像这样的丑陋的黑客(但是如果可行的话……)。

答案 3 :(得分:0)

当您无法使用jq时,可以考虑

id=$(grep -Eo "[0-9A-F]{32}" file)

这仅在文件看起来像我期望的那样时有效,因此您可能需要添加额外的检查内容

id=$(grep "My des_" file | grep -Eo "[0-9A-F]{32}" | head -1)