Como posso analisar a saída JSON no shell?
Por exemplo, o Amazon Web Services fornece uma CLI para recuperar o status de suas instâncias:
$ aws ec2 describe-instances <my_instance_id>
Mas o comando retorna uma sequência JSON. A saída desse comando se parece com isso:
$ aws ec2 describe-instances x12345
{
"Reservations" :
{
"OwnerId": "1345345"
"Groups": [],
"SecurityGroups": [
{
"Foo" : "yes"
"Bar" : "no
}
]
}
}
Existe algum shells embutido que possa ser usado para analisar a saída JSON?
Por exemplo, eu gostaria de capturar em uma variável de shell FOO
o seguinte output["Reservations"]["SecurityGroups"][0]{"Foo"}
.
Caso isso ajude, estou especificamente interessado em soluções que poderiam funcionar com o Zsh.
--output text
se você deseja analisar no shell sem usar ferramentas externas comojshon
.jshon
pela primeira vez, segui seu link. Depois de ler isso, só posso dizer que fiquei muito satisfeito por ter ouvido e instalado por acasojq
primeiro. Eu acho que você gostaria de ouvir sobre isso também, se ainda não o fez - não se incomoda com todas essas opções de linha de comando e pode fazer suas próprias expressões regulares - até permite que você declare funções e variáveis, se desejar. Veja a resposta aqui sobre isso, se você estiver interessado.Respostas:
Pelo que entendi, você está procurando o valor de "Foo". Isso é realmente fácil de fazer com a ferramenta de linha de comando do shell
jq
. É algosed
que implementa seu próprio tipo de linguagem analisadora. Dado o seu exemplo:jq
pode seryes
tão simples quanto:RESULTADO
Você pode percorrer uma lista de hash ou dicionário de objeto usando a
.dot
notação, e as matrizes indexadas podem ser indexadas de maneira mais simples, com, como você provavelmente já adivinhou, índices numéricos, com colchetes. No comando acima, uso o formulário de índice vazio para indicar que desejo que todos os itens iteráveis desse nível sejam expandidos. Pode ser mais fácil entender dessa maneira:... que divide todos os valores para os itens de segundo nível no hash e me deixa ...
Isso apenas arranha a superfície com relação aos
jq
recursos. É uma ferramenta imensamente poderosa para serializar dados no shell, é compilada em um único binário executável no estilo clássico do Unix, provavelmente está disponível via gerenciador de pacotes para sua distribuição e está muito bem documentada. Por favor, visite seugit
-page e veja por si mesmo.A propósito, outra maneira de lidar com dados em camadas
json
- pelo menos para ter uma ideia do que você está trabalhando - pode ser o contrário e usar a.dot
notação para quebrar todos os valores em todos os níveis, como:Mas muito melhor, provavelmente, seria apenas usar um dos muitos métodos de descoberta ou pesquisa
jq
oferecidos para os vários tipos de nós.fonte
Esta é uma resposta ao seu objetivo, mas não à sua pergunta. Isso significa que você pode atingir seu objetivo sem usar um analisador JSON.
O AWS cli util tem a capacidade de gerar apenas campos de seleção usando o
--query
argumento Isso está documentado aqui .Por exemplo:
Você pode até selecionar vários campos se desejar:
E você também pode mostrar várias estruturas correspondentes:
fonte