2

У меня есть массив данных JSON, печатаемых в терминал (OS X), и я хочу, чтобы свойства этого отображались в таблице в терминале.

Пример запроса:

aws ec2 describe-instances 
  | jq '[ .[] | .[] | .Instances[] as $ins
  | { groups: $ins.SecurityGroups[].GroupName,
    addresses: [ $ins.PrivateIpAddress, $ins.PublicIpAddress ],
    dns: $ins.PrivateDnsName,
    name: ($ins.Tags[] as $ts | $ts.Key == "Name" | $ts.Value ) }
  | select(.name | contains("prod")) ]'

Другими словами: я хочу взять результирующую структуру данных (массив объектов, содержащий свойства 'адреса', 'группы', 'днс', 'имя') и поместить каждый объект в строку таблицы внутри терминала / Баш.

Я не против, чтобы данные были обработаны до того, как таблица начнет рисовать.

Пример JSON:

[
  {
    "name": "prod-clusterX-01",
    "dns": "ip-10-34-XX-XX.eu-west-1.compute.internal",
    "addresses": [
      "10.34.XX.XX",
      "54.246.XX.XX"
    ],
    "groups": "prod-clusterX"
  },
  {
    "name": "prod-revproxy-a",
    "dns": "ip-10-0-XX-XX.eu-west-1.compute.internal",
    "addresses": [
      "10.0.XX.XX",
      "54.229.XX.XX"
    ],
    "groups": "prod-revproxy"
  }
]

2 ответа2

0

Хороший ответ @slhck!

Вот еще несколько примеров:

aws ec2 describe-instances | jq '[ .[] | .[] | .Instances[] as $ins
  | select(.Platform == null)
  | { instance_type: $ins.InstanceType,
      name: ($ins.Tags[] as $ts | select($ts.Key == "Name") | $ts.Value ),
      security_groups: $ins.SecurityGroups[].GroupName,
      launched: $ins.LaunchTime } ]' | ./to-table.rb

to-table.rb теперь сам проверит наличие массивов:

#!/usr/bin/env ruby

require "json"
require "table_print"

def join_arrays row
  row.keys.each do |key|
    row[key] = row[key].join(', ') if row[key].respond_to? :join
  end
end

d = JSON.parse(ARGF.read).each { |row| join_arrays row }
w = `/usr/bin/env tput cols`.to_i
tp.set :max_width, w
tp d

(PS: tput cols количество столбцов, которые есть у текущего bash.)

0

Поскольку OS X поставляется с Ruby:

sudo gem install json
sudo gem install table_print

В демонстрационных целях я сохранил вашу строку JSON во input файл, но вы также можете передать ее в ruby :

ruby -e 'require "rubygems"; require "json"; require "table_print";
d = JSON.parse(ARGF.read);
d = d.map { |row| row["addresses"] = row["addresses"].join(", "); row }; 
tp.set :max_width, 120;
tp d' < input

Это выводит:

NAME             | DNS                                       | GROUPS        | ADDRESSES
--------------------------------------------------------------------------------------------------------
prod-clusterX-01 | ip-10-34-XX-XX.eu-west-1.compute.internal | prod-clusterX | 10.34.XX.XX, 54.246.XX.XX
prod-revproxy-a  | ip-10-0-XX-XX.eu-west-1.compute.internal  | prod-revproxy | 10.0.XX.XX, 54.229.XX.XX

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .