【发布时间】:2018-04-26 20:32:01
【问题描述】:
数据样本 - sample.json(完整样本:https://pastebin.com/KFkVmc2M)
{
"ip": 3301234701,
"_shodan": {
"options": {
"referrer": "7ae15507-f5cc-4353-b72e-5cc0b1c34c5e"
},
},
"hash": -1056085507,
"os": null,
"title": "WHM Login",
"opts": {
"vulns": ["!CVE-2014-0160"],
"heartbleed": "2017/08/29 09:57:30 196.196.216.13:2087 - SAFE\
}
},
"isp": "Fiber Grid Inc",
"http": {
"redirects": [],
"title": "WHM Login",
"robots": null,
"favicon": null,
"host": "196.196.216.13",
"html":
}
使用 jq 的脚本,我希望它可以工作,但还没有找到其他解决方案。
cat sample.json | jq \
--arg key0 'Host' \
--arg value0 '.host' \
--arg key1 'Vulnerability' \
--arg value1 '.opts.vulns[0]' \
--arg key2 'ISP' \
--arg value2 '.isp' \
'. | .[$key0]= $value0 | .[$key1]=$value1 | .[$key2]=$value2' \
<<<'{}'
我希望但没有得到的最终结果:
{
"Host": "196.196.216.13",
"Vulnerability": "!CVE-2014-0160",
"ISP": "Fiber Grid Inc"
}
现在它只是将对象作为字符串返回,我尝试了很多不同的方法来解决这个问题。我对使用 JSON 和 jq 很陌生,但根据我目前所读到的内容,解决方案可能不像我希望的那么简单?
简单地说,为什么对象没有作为 sample.json 对象的值返回,我必须做什么才能使其工作?
谢谢!
收件人:chepner
{
"196.196.216.13":[
"AS63119",
"Fiber Grid Inc",
"2017-08-29T06:57:22.546423",
"!CVE-2014-0160"
],
"196.196.216.14":[
"AS63119",
"Fiber Grid Inc",
"2017-08-29T06:57:22.546423",
"!CVE-2014-0160"
]
}
【问题讨论】:
-
为什么需要变量?只需使用
jq '{Host: .http.host, Vulnerability: .ops.vulns, IPS: .isp}' tmp.json。 -
@chepner 当然,但在我看来,能够简单地调用不同的参数将允许一种更简单的方式来构建我的数据。最后有了完整的数据集,我希望我的数据结构看起来像这样:(添加到帖子中)
-
坦率地说,它所做的正是我作为用户所期望和希望的。将数据评估为代码通常是不好的做法(出于安全性和可预测性等原因),并且应该需要采取明确的步骤。
-
也就是说,采用接受 JSON 列表并向下遍历由该列表中的元素命名(或编号)的元素的代码当然是可行的。我当然不会期待一个完整的评估者。
-
...所以,如果我要为此写一个答案,它的输入/调用约定看起来更像:
config='{"Host": ["host"], "Vulnerability": ["opts", "vulns", 0], "ISP": ["isp"]}'; jq --argjson config "$config" '...' <in.json
标签: json bash parameter-passing jq data-processing