我有一个包含以下响应的响应跟踪文件:
#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
的价值
答案 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)