Как я могу отсортировать результат jq по загрузке? - PullRequest
0 голосов
/ 04 августа 2020

У меня есть сценарий:

curl --silent "https://api.nordvpn.com/v1/servers?limit=16384"  | jq --raw-output '.[] | select(.locations[].country.city.name == "Bangkok") | "  Server: \(.name)\nHostname: \(.hostname)\n      IP: \(.station)\n Country: \(.locations[0].country.name)\n    City: \(.locations[0].country.city.name)\n    Load: \(.load)\n"'

Результат:

   Server: Thailand #5
Hostname: th5.nordvpn.com
      IP: 122.155.174.64
 Country: Thailand
    City: Bangkok
    Load: 17

  Server: Thailand #6
Hostname: th6.nordvpn.com
      IP: 122.155.174.66
 Country: Thailand
    City: Bangkok
    Load: 10

  Server: Thailand #7
Hostname: th7.nordvpn.com
      IP: 122.155.174.68
 Country: Thailand
    City: Bangkok
    Load: 27

Мне нужна помощь, чтобы разобраться по нагрузке. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Чтобы избежать беспорядка, можно определить вспомогательную функцию:

  def format: 
    (keys_unsorted | max_by(length) | length) as $mx
    | keys_unsorted[] as $k 
    | (($mx - ($k|length)) * " ") + $k + " : " + "\(.[$k])";

Затем основную программу можно записать следующим образом:

  map( select(.locations[].country.city.name == "Bangkok") )
  | sort_by(.load)[]
  | {"Server": .name, 
     "Hostname": .hostname, 
     "IP": .station,
     "Country": .locations[0].country.name,
     "City": .locations[0].country.city.name,
     "Load": .load 
    } 
  | format, ""'

Вывод

При данном вводе первые два сегмента:

  Server : Thailand #8
Hostname : th8.nordvpn.com
      IP : 122.155.174.70
 Country : Thailand
    City : Bangkok
    Load : 10

  Server : Thailand #6
Hostname : th6.nordvpn.com
      IP : 122.155.174.66
 Country : Thailand
    City : Bangkok
    Load : 12

1 голос
/ 04 августа 2020

Попробуйте

curl --silent "https://api.nordvpn.com/v1/servers?limit=16384" |\
    jq --raw-output 'map(select(.locations[].country.city.name == "Bangkok"))| sort_by(.load)[] | "  Server: \(.name)\nHostname: \(.hostname)\n      IP: \(.station)\n Country: \(.locations[0].country.name)\n    City: \(.locations[0].country.city.name)\n    Load: \(.load)\n"'
...