シェルでJSON出力を解析する方法は?
たとえば、Amazon Web Services はインスタンスの状態を取得する CLI を提供します。
$ aws ec2 describe-instances <my_instance_id>
ただし、コマンドはJSON文字列を返します。このコマンドの出力は次のとおりです。
$ aws ec2 describe-instances x12345
{
"Reservations" :
{
"OwnerId": "1345345"
"Groups": [],
"SecurityGroups": [
{
"Foo" : "yes"
"Bar" : "no
}
]
}
}
JSON出力を解析するために使用できる組み込みシェルはありますか?
たとえば、シェル変数にFOO
以下をキャプチャしたいと思いますoutput["Reservations"]["SecurityGroups"][0]{"Foo"}
。
特に役立つ場合は、Zshで動作するソリューションに興味があります。
ベストアンサー1
私が知っているように、あなたは「Foo」の価値を探しているようです。これは本物これはシェルコマンドラインツールを使用して簡単に実行できますjq
。sed
独自のパーサ言語を実装するのと同じです。あなたの例は次のとおりです。
json='
{
"Reservations" :
{
"OwnerId" : "1345345",
"Groups" : [],
"SecurityGroups" : [
{
"Foo" : "yes",
"Bar" : "no"
}
]
}
}'
jq
yes
以下から簡単に入手できます。
printf %s "$json" |
jq '.[].SecurityGroups[0].Foo?'
出力
"yes"
シンボルを使用してオブジェクトのハッシュや辞書のリストを繰り返すこと.dot
ができます。上記のコマンドは、空のインデックス形式を使用して、そのレベルですべての反復可能アイテムを拡張したいことを示します。次のように理解する方が簡単です。
printf %s "$json" | jq '.[][]'
...これは、配列の2番目のレベル項目のすべての値を分析します。
"1345345"
[]
[
{
"Foo": "yes",
"Bar": "no"
}
]
これはjq
機能の表面だけを傷付けます。これはシェルからデータをシリアライズする非常に強力なツールであり、クラシックUnixスタイルで単一の実行可能なバイナリにコンパイルし、ディストリビューションのパッケージマネージャを介して使用でき、良いドキュメントがたくさんあります。ぜひ訪れてみてくださいgit
-ページ自分で確認してください。
階層データを処理する別の方法であるBTW json
(少なくとも作業していることを理解する)は、別の方向に行き、表記を使用して中断する.dot
ことです。みんな値はみんな次のレベル:
printf %s "$json" | jq '..'
{
"Reservations": {
"OwnerId": "1345345",
"Groups": [],
"SecurityGroups": [
{
"Foo": "yes",
"Bar": "no"
}
]
}
}
{
"OwnerId": "1345345",
"Groups": [],
"SecurityGroups": [
{
"Foo": "yes",
"Bar": "no"
}
]
}
"1345345"
[]
[
{
"Foo": "yes",
"Bar": "no"
}
]
{
"Foo": "yes",
"Bar": "no"
}
"yes"
"no"
jq
ただし、より良いアプローチは、さまざまな種類のノードに提供される多くの検索または検索方法のいずれかを使用することです。