Azure CLI では、 --query
パラメーターを使用して、コマンドの結果に対して JMESPath クエリ を実行します。 JMESPath は JSON のクエリ言語であり、CLI 出力からデータを選択および変更できます。
Azure CLI のすべてのコマンドは、 --query
パラメーターをサポートしています。 この記事では、JMESPath の機能を使用する方法について説明し、クエリの例を示します。 [概念] タブでクエリを実行するのに役立つ JMESPath の概念について説明します。[例] タブの JMESPath クエリの例を参照してください。
Azure CLI では、クエリを使用して、Azure CLI コマンドの出力を選択および変更します。 クエリは、表示形式の前に、Azure CLI コマンドの返された JSON オブジェクトでクライアント側で実行されます。
クエリに必要なエスケープ文字は、環境によって異なります。 これらのシェルでは必要なエスケープ文字が少ないため、Azure Cloud Shell または cmd でクエリを実行することをお勧めします。 クエリの例が構文的に正しいことを確認するには、使用しているシェルのタブを選択します。
ディクショナリと CLI の結果の一覧
出力形式が JSON 以外の場合でも、CLI コマンドの結果は最初にクエリの JSON として扱われます。 CLI の結果は、JSON 配列またはディクショナリのいずれかになります。 配列はインデックスを作成できるオブジェクトのシーケンスであり、ディクショナリはキーでアクセスされる順序付けされていないオブジェクトです。
配列の例を次に示します。
[
1,
2,
3
]
辞書の例を次に示します。
{
"isRunning": false,
"time": "12:00",
"number": 1
}
複数のオブジェクトを返 すことができる コマンドは配列を返し、 常に 1 つのオブジェクト のみを 返すコマンドはディクショナリを返します。
ディクショナリ内のプロパティを取得する
ディクショナリの結果を操作すると、キーだけで最上位レベルのプロパティにアクセスできます。
.
(部分式) 文字は、入れ子になったディクショナリのプロパティにアクセスするために使用されます。 クエリを導入する前に、 az vm show コマンドの変更されていない出力を確認してください。
az vm show --resource-group QueryDemo --name TestVM
このコマンドはディクショナリを出力します。 一部のコンテンツは省略されています。
{
"additionalCapabilities": null,
"availabilitySet": null,
"diagnosticsProfile": {
"bootDiagnostics": {
"enabled": true,
"storageUri": "https://xxxxxx.blob.core.windows.net/"
}
},
...
"osProfile": {
"adminPassword": null,
"adminUsername": "azureuser",
"allowExtensionOperations": true,
"computerName": "TestVM",
"customData": null,
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"provisionVmAgent": true,
"ssh": {
"publicKeys": [
{
"keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso",
"path": "/home/azureuser/.ssh/authorized_keys"
}
]
}
},
"secrets": [],
"windowsConfiguration": null
},
....
}
次のコマンドは、クエリを追加することで、VM への接続が承認された SSH 公開キーを取得します。
az vm show --resource-group QueryDemo --name TestVM --query "osProfile.linuxConfiguration.ssh.publicKeys"
[
{
"keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso",
"path": "/home/azureuser/.ssh/authorized_keys"
}
]
クエリ文字列では大文字と小文字が区別されます。 たとえば、前のクエリで 'osProfile' を 'OsProfile' に変更しても、正しい結果が返されません。
複数の値を取得する
複数のプロパティを取得するには、式をコンマで区切って角かっこ [ ]
( 複数選択リスト) に配置します。 次のコマンドは、VM 名、管理者ユーザー、SSH キーをすべて一度に取得します。
az vm show --resource-group QueryDemo --name TestVM --query "[name, osProfile.adminUsername, osProfile.linuxConfiguration.ssh.publicKeys[0].keyData]"
[
"TestVM",
"azureuser",
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
]
これらの値は、クエリで指定された順序で結果配列に一覧表示されます。 結果は配列であるため、結果に関連付けられたキーはありません。 配列の代わりにディクショナリを取得するには、次のセクションを参照してください。
クエリ内のプロパティの名前を変更する
複数の値を照会するときに配列の代わりにディクショナリを取得するには、 { }
(複数選択ハッシュ) 演算子を使用します。
複数選択ハッシュの形式は {displayName:JMESPathExpression, ...}
。
displayName
は出力に表示される文字列で、 JMESPathExpression
は評価する JMESPath 式です。 複数選択リストをハッシュに変更して、最後のセクションの例を変更します。
注
VMName
ではなくVM name
など、新しい列名にスペースを使用することを選択した場合、Bash と PowerShell の両方で引用符の規則が変更されます。 例については、「 Azure CLI パラメーターでスペースを渡す 」を参照してください。
az vm show --resource-group QueryDemo --name TestVM --query "{VMName:name, admin:osProfile.adminUsername, sshKey:osProfile.linuxConfiguration.ssh.publicKeys[0].keyData}"
{
"VMName": "TestVM",
"admin": "azureuser",
"ssh-key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
}
配列内のプロパティを取得する
配列には独自のプロパティはありませんが、インデックスを作成できます。 この機能は、publicKeys
配列の最初の要素を取得する式publicKeys[0]
の最後の例に示されています。 CLI 出力が順序付けされる保証はないため、順序が確実であるか、取得する要素が気にならない限り、インデックス作成を使用しないでください。 配列内の要素のプロパティにアクセスするには、 フラット化 または フィルター処理の 2 つの操作のいずれかを実行します。 このセクションでは、配列をフラット化する方法について説明します。
配列のフラット化は、 []
JMESPath 演算子を使用して行われます。
[]
演算子の後にあるすべての式は、現在の配列内の各要素に適用されます。
[]
クエリの開始時に表示される場合は、CLI コマンドの結果がフラット化されます。
az vm list
の結果は、この機能を使用して検査できます。
次のクエリでは、リソース グループ内の各 VM の名前、OS、管理者の名前を取得します。
az vm list --resource-group QueryDemo --query "[].{Name:name, OS:storageProfile.osDisk.osType, admin:osProfile.adminUsername}"
[
{
"Name": "Test-2",
"OS": "Linux",
"admin": "sttramer"
},
{
"Name": "TestVM",
"OS": "Linux",
"admin": "azureuser"
},
{
"Name": "WinTest",
"OS": "Windows",
"admin": "winadmin"
}
]
コマンドによって返される最上位の結果だけでなく、任意の配列をフラット化できます。 最後のセクションでは、 osProfile.linuxConfiguration.ssh.publicKeys[0].keyData
式を使用してサインイン用の SSH 公開キーを取得しました。
すべての SSH 公開キーを取得するために、代わりに式をosProfile.linuxConfiguration.ssh.publicKeys[].keyData
として記述できます。
このクエリ式は、 osProfile.linuxConfiguration.ssh.publicKeys
配列をフラット化し、各要素に対して keyData
式を実行します。
az vm show --resource-group QueryDemo --name TestVM --query "{VMName:name, admin:osProfile.adminUsername, sshKeys:osProfile.linuxConfiguration.ssh.publicKeys[].keyData }"
{
"VMName": "TestVM",
"admin": "azureuser",
"sshKeys": [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso\n"
]
}
ブール式を使用して配列をフィルター処理する
配列からデータを取得するために使用されるもう 1 つの操作は フィルター処理です。 フィルター処理は、 [?...]
JMESPath 演算子を使用して行われます。
この演算子は、内容として述語を受け取ります。 述語は、 true
または false
に評価できる任意のステートメント (ブール型プロパティを含む) です。 述語が true
に評価される式が出力に含まれます。
最初のクエリでは、 isDefault
プロパティが true のアカウントに接続されているすべての Azure サブスクリプションの名前を一覧表示する方法を示します。 2 番目と 3 番目のクエリは、 isDefault
プロパティが false であるすべてのサブスクリプションを一覧表示する 2 つの異なる方法を示しています。
# Boolean values are assumed to be true, so you can directly evaluate the isDefault property to return the default subscription.
az account list --query "[?isDefault].name"
# To check if a Boolean property is false, you can use the comparison operator == or the logical operator !.
az account list --query '[?!isDefault].name'
az account list --query "[?isDefault == \`false\`].name"
JMESPath には、標準の比較演算子と論理演算子が用意されています。 これには、 <
、 <=
、 >
、 >=
、 ==
、および !=
が含まれます。 JMESPath では、論理 (&&
)、(||
)、(!
) もサポートされません。 式はかっこ内でグループ化できるため、より複雑な述語式を使用できます。 述語と論理操作の詳細については、 JMESPath の仕様を参照してください。
最後のセクションでは、配列をフラット化して、リソース グループ内のすべての VM の完全な一覧を取得しました。 フィルターを使用すると、この出力を Linux VM のみに制限できます。
az vm list --resource-group QueryDemo --query "[?storageProfile.osDisk.osType=='Linux'].{Name:name, admin:osProfile.adminUsername}" --output table
Name Admin
------ ---------
Test-2 sttramer
TestVM azureuser
OS ディスク サイズなどの数値をフィルター処理することもできます。 次の例では、VM の一覧をフィルター処理して、ディスク サイズが 50 GB 以上の VM を表示する方法を示します。
az vm list --resource-group QueryDemo --query "[?storageProfile.osDisk.diskSizeGb >=\`50\`].{Name:name, admin:osProfile.adminUsername, DiskSize:storageProfile.osDisk.diskSizeGb }" --output table
Name Admin DiskSize
------- -------- --------
WinTest winadmin 127
大きな配列の場合、データを選択する前にフィルターを適用する方が高速な場合があります。
Von Bedeutung
JMESPath では、文字列は常に単一引用符 ('
) またはエスケープ文字 (`
) で囲まれます。 フィルター述語で文字列の一部として二重引用符を使用すると、空の出力が表示されます。
JMESPath 関数
JMESPath には、より複雑なクエリやクエリ出力の変更を可能にする関数も組み込まれています。 このセクションでは、JMESPath 関数を使用してクエリを作成する方法に焦点を当て、 関数を使用した出力の操作 に関するセクションでは、関数を使用して出力を変更する方法を示します。
式は関数を呼び出す前に評価されるため、引数自体を JMESPath 式にすることができます。 次の例では、文字列に部分文字列が含まれているかどうかを確認する contains(string, substring)
を使用して、この概念を示します。 このコマンドは、OS ディスクに SSD ストレージを使用しているすべての VM を検索します。
az vm list --resource-group QueryDemo --query "[?contains(storageProfile.osDisk.managedDisk.storageAccountType,'SSD')].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType}"
[
{
"Name": "TestVM",
"Storage": "StandardSSD_LRS"
},
{
"Name": "WinTest",
"Storage": "StandardSSD_LRS"
}
]
パイプ表現
コマンド ラインでの |
の使用方法と同様に、JMESPath クエリで |
を使用して、中間クエリ結果に式を適用できます。 また、 |
を使用して、複雑なクエリを単純な部分式に分割することもできます。 前のセクションのクエリを短縮するには、 |
を使用して、データをフラット化して選択した後にフィルターを適用します。
az vm list --resource-group QueryDemo --query "[].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType} | [? contains(Storage,'SSD')]"
[
{
"Name": "TestVM",
"Storage": "StandardSSD_LRS"
},
{
"Name": "WinTest",
"Storage": "StandardSSD_LRS"
}
]
関数の完全な一覧については、 JMESPath 仕様の組み込み関数 を参照してください。
関数を使用した出力の操作
JMESPath 関数には、クエリの結果を操作する別の目的もあります。 非ブール値を返す関数は、式の結果を変更します。 たとえば、 sort_by(array, &sort_expression)
を使用してプロパティ値でデータを並べ替えることができます。 JMESPath は、関数の一部として後で評価する必要がある式に対して、特殊な演算子 ( &
) を使用します。 次の例では、OS ディスク サイズで VM リストを並べ替える方法を示します。
az vm list --resource-group QueryDemo --query "sort_by([].{Name:name, Size:storageProfile.osDisk.diskSizeGb}, &Size)" --output table
Name Size
------- ------
Test-2 30
TestVM 32
WinTest 127
関数の完全な一覧については、 JMESPath 仕様の組み込み関数 を参照してください。
クエリ結果の書式設定
Azure CLI では既定の出力形式として JSON が使用されますが、目的と結果に応じてクエリに適した出力形式が異なる場合があります。 クエリは常に JSON
出力で最初に実行され、その後書式設定されます。
このセクションでは、 tsv
と table
書式設定、および各形式のユース ケースについて説明します。 出力形式の詳細については、「 Azure CLI コマンドの出力形式」を参照してください。
TSV 出力形式
tsv
出力形式は、追加の書式設定、キー、またはその他のシンボルを使用せずに、タブ区切り値と改行区切り値を返します。 この形式は、出力がパラメーターに格納され、別のコマンドで使用される場合に便利です。
tsv
書式設定のユース ケースの 1 つは、AZURE リソース ID やリソース名などの CLI コマンドから値を取得し、その値をローカル環境変数に格納するクエリです。 既定では、結果は JSON 形式で返されます。これは、 "
文字で囲まれた JSON 文字列を処理するときに問題になる可能性があります。 コマンド出力が環境変数に直接割り当てられている場合、引用符はシェルによって解釈 されない 可能性があります。 この問題は、クエリ結果を環境変数に割り当てる次の例で確認できます。
USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername")
echo $USER
"azureuser"
次のクエリで示すように、 tsv
書式設定を使用して、戻り値を型情報で囲むのを防ぎます。
USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername" --output tsv)
echo $USER
azureuser
表の出力形式
table
形式では、出力が ASCII テーブルとして出力されるため、読み取りとスキャンが簡単になります。 すべてのフィールドがテーブルに含まれているわけではないため、この形式は、人間が検索できるデータの概要として最適に使用されます。 テーブルに含まれていないフィールドは、クエリの一部としてフィルター処理できます。
注
特定のキーは除外され、テーブル ビューには出力されません。 これらのキーは、 id
、 type
、および etag
です。 これらの値を表示するには、複数選択ハッシュのキー名を変更します。
az vm show --resource-group QueryDemo --name TestVM --query "{objectID:id}" --output table
前のクエリを使用して、この概念を示すことができます。 元のクエリでは、リソース グループ内の各 VM の名前、OS、および管理者名を含む JSON オブジェクトが返されました。
az vm list --resource-group QueryDemo --query "[].{Name:name, OS:storageProfile.osDisk.osType, admin:osProfile.adminUsername}"
[
{
"Name": "Test-2",
"OS": "Linux",
"admin": "sttramer"
},
{
"Name": "TestVM",
"OS": "Linux",
"admin": "azureuser"
},
{
"Name": "WinTest",
"OS": "Windows",
"admin": "winadmin"
}
]
--output table
出力形式と組み合わせると、列名が複数選択ハッシュのdisplayKey
値と一致するため、情報を簡単に読み取れます。
az vm list --resource-group QueryDemo --query "[].{Name:name, OS:storageProfile.osDisk.osType, Admin:osProfile.adminUsername}" --output table
Name OS Admin
------- ------- ---------
Test-2 Linux sttramer
TestVM Linux azureuser
WinTest Windows winadmin
次のステップ
JMESPath クエリの詳細については、 JMESPath チュートリアルを参照してください。
この記事で説明されている他の Azure CLI の概念の詳細については、次を参照してください。
Azure CLI