JQ если тогда область заявления - PullRequest
1 голос
/ 23 марта 2020

Я бы хотел использовать JQ для захвата только тех подзаписей, которые соответствуют оператору if-then. Когда я использую

jq 'if .services[].banner == "FQMDAAICCg==" then .services[].port else empty end

, он захватывает все порты для записи. (в каждой записи есть несколько сервисов, и я хочу ограничить свой оператор then только областью сервисов, в которой я действительно нашел условие if).

Как мне просто получить порт, баннер и т. д. c , для указанной службы c под записью, которая достигла моего состояния?

пример:

{
  "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 Ответ

1 голос
/ 23 марта 2020

Оригинальный вопрос

Как мне просто получить порт, баннер и т. Д. c. для указанной службы c под записью, которая соответствует моему условию?

Чтобы получить только "порт" для службы, соответствующей условию, вы можете изменить свой запрос:

.services[]
| if .banner == "FQMDAAICCg==" then .port else empty end

Эквивалентно:

.services[]
| select(.banner == "FQMDAAICCg==")
| .port

Дополнительная цель

Я хочу закончить в этом примере с '8085' + '103.238.62.68'

Если вам действительно нужны два значения в этом формате, вы можете написать что-нибудь в следующих строках, вызвав jq с опцией -r:

.ip as $ip
| (.services[] | select(.banner == "FQMDAAICCg==") | .port) as $port
| "'\($port)' + '\($ip)'"

или более кратко, но менее читабельно:

"'\(.services[] | select(.banner == "FQMDAAICCg==") | .port)' + '\(.ip)'"
...