JQ if then语句范围

时间:2020-03-23 10:44:52

标签: json bash jq

我想使用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'

这很丑陋,但能解决问题,但仍然允许我将数据流式传输到第一个过滤器。

1 个答案:

答案 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)'"