A disponibilidade de analisadores em quase todas as linguagens de programação é uma das vantagens do JSON como formato de troca de dados.
Em vez de tentar implementar um analisador JSON, é melhor usar uma ferramenta criada para análise JSON, como jq ou uma linguagem de script de propósito geral que tenha uma biblioteca JSON.
Por exemplo, usando jq, você pode extrair o ImageID do primeiro item da matriz Instances da seguinte forma:
jq '.Instances[0].ImageId' test.json
Como alternativa, para obter as mesmas informações usando a biblioteca JSON do Ruby:
ruby -rjson -e 'j = JSON.parse(File.read("test.json")); puts j["Instances"][0]["ImageId"]'
Não vou responder a todas as suas perguntas e comentários revisados, mas o que se segue é o suficiente para você começar.
Suponha que você tenha um script Ruby que possa ler um de STDIN e gerar a segunda linha em sua saída de exemplo [0]. Esse script pode parecer algo como:
#!/usr/bin/env ruby
require 'json'
data = JSON.parse(ARGF.read)
instance_id = data["Instances"][0]["InstanceId"]
name = data["Instances"][0]["Tags"].find {|t| t["Key"] == "Name" }["Value"]
owner = data["Instances"][0]["Tags"].find {|t| t["Key"] == "Owner" }["Value"]
cost_center = data["Instances"][0]["SubnetId"].split("-")[1][0..3]
puts "#{instance_id}\t#{name}\t#{cost_center}\t#{owner}"
Como você pode usar esse script para atingir todo o seu objetivo? Bem, suponha que você já tenha o seguinte:
- um comando para listar todas as suas instâncias
- um comando para obter o json acima para qualquer instância em sua lista e enviá-lo para STDOU
Uma maneira seria usar seu shell para combinar essas ferramentas:
echo -e "Instance id\tName\tcost centre\tOwner"
for instance in $(list-instances); do
get-json-for-instance $instance | ./ugly-ruby-scriptrb
done
Agora, talvez você tenha um único comando que forneça um json blob para todas as instâncias com mais itens nesse array "Instances". Bem, se for esse o caso, você só precisará modificar o script um pouco para percorrer a matriz em vez de simplesmente usar o primeiro item.
No final, a maneira de resolver este problema, é a maneira de resolver muitos problemas no Unix. Divida-o em problemas mais fáceis. Encontre ou escreva ferramentas para resolver o problema mais fácil. Combine essas ferramentas com o seu shell ou com outros recursos do sistema operacional.
[0] Note que eu não tenho ideia de onde você obtém o centro de custo, então eu apenas inventei.