我想使用JQ仅捕获与if-then语句匹配的子记录。当我使用
jq 'if .services[].banner == "FQMDAAICCg==" then .services[].port else empty end
它获取所有端口以进行记录。 (每个记录下有多个服务,我想将then语句限制为仅在实际找到if条件的服务范围内进行。)
如何仅在符合我条件的记录下获取特定服务的端口,横幅等?
示例:
{
"services": [
{
"tls_detected": false,
"banner_is_raw": true,
"transport_protocol": "tcp",
"banner": "PCFET0NUWVBFIEhU",
"certificate": null,
"timestamp": "2020-03-22T00:38:01.074Z",
"protocol": null,
"port": 4444
},
{
"tls_detected": false,
"banner_is_raw": true,
"transport_protocol": "tcp",
"banner": "SFRUUC8xLjEgMzA",
"certificate": null,
"timestamp": "2020-03-19T01:39:45.288Z",
"protocol": null,
"port": 8080
},
{
"tls_detected": false,
"banner_is_raw": true,
"transport_protocol": "tcp",
"banner": "FQMDAAICCg==",
"certificate": null,
"timestamp": "2020-03-19T01:39:45.288Z",
"protocol": null,
"port": 8085
},
{
"tls_detected": false,
"banner_is_raw": false,
"transport_protocol": "tcp",
"banner": "Q2FjaGUtQ29ud",
"certificate": null,
"timestamp": "2020-03-20T04:25:24Z",
"protocol": "http",
"port": 8080
}
],
"ip": "103.238.62.68",
"autonomous_system": {
"description": "CHAPTECH-AS-AP Chaptech Pty Ltd",
"asn": 133493,
"routed_prefix": "103.238.62.0/24",
"country_code": "AU",
"name": "CHAPTECH-AS-AP Chaptech Pty Ltd",
"path": [
11164,
3491,
63956,
7594,
7594,
7594,
7594,
133493
]
},
"location": {
"country_code": "AU",
"registered_country": "Australia",
"registered_country_code": "AU",
"continent": "Oceania",
"timezone": "Australia/Sydney",
"latitude": -33.494,
"longitude": 143.2104,
"country": "Australia"
}
}
更新:
感谢达到顶峰,但我无法在下面达到其他目标。我最终使用了
jq 'select(.services[].banner == "FQMDAAICCg==") | {port: .services[].port, banner: .services[].banner, ip: .ip}' censys.json | jq 'if .banner == "FQMDAAICCg==" then .ip,.port else empty end'
这很丑陋,但能解决问题,但仍然允许我将数据流式传输到第一个过滤器。
答案 0 :(得分:1)
如何仅在符合我条件的记录下获取特定服务的端口,横幅等?
要仅获取符合条件的服务的“端口”,可以修改查询:
.services[]
| if .banner == "FQMDAAICCg==" then .port else empty end
等效地:
.services[]
| select(.banner == "FQMDAAICCg==")
| .port
我想在本示例中以'8085'+'103.238.62.68'结束
如果您确实希望使用该格式的两个值,则可以按照以下几行编写内容,并使用-r选项调用jq:
.ip as $ip
| (.services[] | select(.banner == "FQMDAAICCg==") | .port) as $port
| "'\($port)' + '\($ip)'"
或更简短但更不易理解:
"'\(.services[] | select(.banner == "FQMDAAICCg==") | .port)' + '\(.ip)'"