Dotazování výstupu příkazu Azure CLI pomocí dotazu JMESPath

Azure CLI používá --query parametr ke spuštění dotazu JMESPath na výsledky příkazů. JMESPath je dotazovací jazyk JSON, který umožňuje vybrat a upravit data z výstupu rozhraní příkazového řádku.

Parametr --query podporuje všechny příkazy v Azure CLI. Tento článek popisuje, jak používat funkce JMESPath a poskytuje příklady dotazů. Seznamte se s koncepty JMESPath, které jsou užitečné pro dotazování na kartě Koncepty. Podívejte se na příklady dotazů JMESPath na kartě Příklady.

Azure CLI používá dotazy k výběru a úpravě výstupu příkazů Azure CLI. Dotazy se spouští na straně klienta na vrácený objekt JSON příkazu Azure CLI před jakýmkoli formátováním zobrazení.

Řídicí znaky potřebné v dotazech se liší pro různá prostředí. Doporučujeme spouštět dotazy v Azure CloudShellu nebo cmd, protože tyto prostředí vyžadují méně řídicích znaků. Pokud chcete zajistit, aby byly příklady dotazů syntakticky správné, vyberte kartu pro prostředí, které používáte.

Výsledky rozhraní příkazového řádku slovníku a seznamu

I při použití jiného výstupního formátu než JSON se výsledky příkazů ROZHRANÍ příkazového řádku nejprve považují za JSON pro dotazy. Výsledky rozhraní příkazového řádku jsou pole JSON nebo slovník. Pole jsou sekvence objektů, které lze indexovat, a slovníky jsou neuspořádané objekty, ke kterým se přistupuje pomocí klíčů.

Následuje příklad pole:

[ 
  1,
  2,
  3
]

Následuje příklad slovníku:

{
  "isRunning": false,
  "time": "12:00",
  "number": 1
}

Příkazy, které by mohly vrátit více než jeden objekt, vrací pole a příkazy, které vždy vrací pouze jeden objekt, vrátí slovník.

Získání vlastností ve slovníku

Při práci s výsledky slovníku můžete přistupovat k vlastnostem z nejvyšší úrovně pouze pomocí klíče. Znak . (subexpression) slouží k přístupu k vlastnostem vnořených slovníků. Než začnete zavádět dotazy, podívejte se na nemodifikovaný výstup příkazu az vm show :

az vm show --resource-group QueryDemo --name TestVM

Příkaz vypíše slovník. Byl vynechán nějaký obsah.

{
  "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
  },
  ....
}

Následující příkaz získá veřejné klíče SSH autorizované pro připojení k virtuálnímu počítači přidáním dotazu:

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"
  }
]

Všimněte si, že řetězce dotazů rozlišují malá a velká písmena. Například změna osProfile na OsProfile v dotazu výše nevrátí správné výsledky.

Získání více hodnot

Pokud chcete získat více než jednu vlastnost, umístěte výrazy oddělené čárkami do hranatých závorek [ ] ( seznam s vícenásobným výběrem). Následující příkaz načte název virtuálního počítače, uživatele správce a klíč SSH najednou:

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"
]

Tyto hodnoty jsou uvedeny ve výsledném poli v pořadí, v jakém byly zadány v dotazu. Vzhledem k tomu, že výsledek je pole, nejsou k výsledkům přidruženy žádné klíče. Pokud chcete místo pole získat slovník, přečtěte si následující část.

Přejmenování vlastností v dotazu

Pokud chcete při dotazování na více hodnot získat slovník místo pole, použijte { } operátor (multiselect hash). Formát hodnoty hash s vícenásobným výběrem je {displayName:JMESPathExpression, ...}. displayName bude řetězec zobrazený ve výstupu a JMESPathExpression je výraz JMESPath, který se má vyhodnotit. Úprava příkladu z poslední části změnou seznamu multiselect na hodnotu hash:

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"
}

Získání vlastností v poli

Pole nemá žádné vlastní vlastnosti, ale lze ho indexovat. Tato funkce se zobrazí v posledním příkladu s výrazem publicKeys[0], který získá první prvek publicKeys pole. Neexistuje žádná záruka, že je výstup rozhraní příkazového řádku seřazený, takže pokud si nejste jistí pořadím nebo nezajímáte, který prvek získáte, nepoužívejte indexování. Pokud chcete získat přístup k vlastnostem prvků v poli, proveďte jednu ze dvou operací: zploštění nebo filtrování. Tato část popisuje, jak zploštět pole.

Zploštění pole se provádí pomocí operátoru [] JMESPath. Všechny výrazy za operátorem [] se použijí na každý prvek v aktuálním poli. Pokud [] se zobrazí na začátku dotazu, zploštělí výsledek příkazu rozhraní příkazového řádku. Výsledky az vm list této funkce lze zkontrolovat. Následující dotaz získá název, operační systém a název správce pro každý virtuální počítač ve skupině prostředků:

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"
  }
]

Jakékoli pole lze zploštět, ne pouze výsledek nejvyšší úrovně vrácený příkazem. V poslední části se výraz osProfile.linuxConfiguration.ssh.publicKeys[0].keyData použil k získání veřejného klíče SSH pro přihlášení. Pokud chcete získat každý veřejný klíč SSH, výraz by místo toho mohl být zapsán jako osProfile.linuxConfiguration.ssh.publicKeys[].keyData. Tento výraz dotazu zploštějí osProfile.linuxConfiguration.ssh.publicKeys pole a potom spustí keyData výraz na každém prvku:

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"
  ]
}

Filtrování polí pomocí logických výrazů

Druhá operace, která slouží k získání dat z pole, je filtrování. Filtrování se provádí pomocí operátoru [?...] JMESPath. Tento operátor přebírá predikát jako jeho obsah. Predikát je libovolný příkaz, včetně logických vlastností, které lze vyhodnotit na buď true nebo false. Výrazy, ve kterých se predikát vyhodnotí jako true zahrnutý ve výstupu.

První dotaz ukazuje, jak zobrazit seznam názvů všech předplatných Azure připojených k vašemu účtu, jehož isDefault vlastnost je pravdivá. Druhý a třetí dotaz ukazuje dva různé způsoby výpisu všech předplatných, jejichž isDefault vlastnost je false.

# 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 nabízí standardní porovnávací a logické operátory. Patří mezi <ně , , >=``<=``>, , ==a !=. JMESPath také podporuje logické a (&&) nebo (||) a ne (!). Výrazy lze seskupit do závorek, což umožňuje složitější predikátové výrazy. Úplné podrobnosti o predikátech a logických operacích najdete ve specifikaci JMESPath.

V poslední části jste zploštěli pole, abyste získali úplný seznam všech virtuálních počítačů ve skupině prostředků. Pomocí filtrů je možné tento výstup omezit jenom na virtuální počítače s Linuxem:

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

Můžete také filtrovat číselné hodnoty, například velikost disku s operačním systémem. Následující příklad ukazuje, jak filtrovat seznam virtuálních počítačů tak, aby se zobrazily s velikostí disku větší nebo rovnou 50 GB.

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

U velkých polí může být rychlejší použít filtr před výběrem dat.

Důležité

V JMESPathu jsou řetězce vždy obklopeny jednoduchými uvozovkami (') nebo řídicími znaky (`). Pokud jako součást řetězce v predikátu filtru použijete dvojité uvozovky, získáte prázdný výstup.

JMESPath – funkce

JMESPath má také integrované funkce, které umožňují složitější dotazy a úpravu výstupu dotazu. Tato část se zaměřuje na použití funkcí JMESPath k vytváření dotazů při práci s výstupem s oddílem funkcí ukazuje použití funkcí k úpravě výstupu.

Výrazy se vyhodnocují před voláním funkce, takže samotné argumenty mohou být výrazy JMESPath. Následující příklady ukazují použití contains(string, substring), který kontroluje, zda řetězec obsahuje podřetězce. Tento příkaz najde všechny virtuální počítače používající úložiště SSD pro disk s operačním systémem:

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"
  }
]

Výrazy potrubí

Podobně jako při | použití v příkazovém řádku | je možné použít v dotazech JMESPath k použití výrazů na zprostředkující výsledky dotazu. Můžeme také použít | k rozdělení složitých dotazů na jednodušší dílčí výrazy. Pokud chcete zkrátit dotaz z předchozí části, použijte | filtr po zploštění a výběru dat.

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"
  }
]

Úplný seznam funkcí najdete ve specifikaci JMESPath – integrované funkce .

Manipulace s výstupem pomocí funkcí

Funkce JMESPath mají také jiný účel, který má pracovat s výsledky dotazu. Každá funkce, která vrátí nelogická hodnota, změní výsledek výrazu. Data můžete například seřadit podle hodnoty vlastnosti pomocí sort_by(array, &sort_expression). JMESPath používá speciální operátor , &pro výrazy, které by se měly vyhodnotit později jako součást funkce. Následující příklad ukazuje, jak seřadit seznam virtuálních počítačů podle velikosti disku s operačním systémem:

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

Úplný seznam funkcí najdete ve specifikaci JMESPath – integrované funkce .

Formátování výsledků dotazu

Azure CLI používá jako výchozí výstupní formát JSON, ale různé formáty výstupu můžou lépe vyhovovat dotazu v závislosti na účelu a výsledcích. Všimněte si, že dotazy se vždy spouští na výstupu JSON a pak jsou naformátované.

V této části se projde tsv formátování a table některé případy použití pro každý formát. Další informace o výstupních formátech najdete v tématu Formáty výstupu pro příkazy Azure CLI.

Výstupní formát TSV

Výstupní formát tsv vrací hodnoty oddělené tabulátorem a znakem nového řádku, a to bez dalšího formátování, klíčů nebo jiných symbolů. To je užitečné v případě, že výstup využívá jiný příkaz.

Jedním z případů použití pro tsv formátování je dotazy, které načítají hodnotu z příkazu rozhraní příkazového řádku, například ID prostředku Azure nebo název prostředku, a uloží hodnotu do místní proměnné prostředí. Ve výchozím nastavení se výsledky vrátí ve formátu JSON. Může se jednat o problém při práci s řetězci JSON, které jsou uzavřeny do " znaků. Uvozovky nemusí prostředí interpretovat, pokud je výstup příkazu přímo přiřazen k proměnné prostředí. To je vidět v následujícím příkladu, který přiřadí výsledek dotazu proměnné prostředí:

USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername")
echo $USER
"azureuser"

Chcete-li zabránit uzavření návratových hodnot s informacemi o typu, použijte tsv formátování, jak je znázorněno v následujícím dotazu:

USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername" --output tsv)
echo $USER
azureuser

Výstupní formát tabulky

Ve formátu table se výstup vytiskne jako tabulka ASCII, což usnadňuje čtení a prohledávání. V tabulce nejsou zahrnuta všechna pole, takže tento formát se nejlépe používá jako přehled dat, který lze prohledávat člověkem. Pole, která nejsou zahrnutá v tabulce, se stále dají filtrovat jako součást dotazu.

Poznámka

Některé klíče se odfiltrují a v zobrazení tabulky se nevytisknou. Jde o klíče id, type a etag. Pokud chcete tyto hodnoty zobrazit, můžete změnit název klíče v hodnotě hash s vícenásobným výběrem.

az vm show --resource-group QueryDemo --name TestVM --query "{objectID:id}" --output table

K předvedení můžeme použít předchozí dotaz. Původní dotaz vrátil objekt JSON obsahující název, operační systém a název správce pro každý virtuální počítač ve skupině prostředků:

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"
  }
]

V kombinaci s výstupním --output table formátem se názvy sloupců shodují s displayKey hodnotou hodnoty hodnoty hash s vícenásobným výběrem, což usnadňuje přeskakování informací:

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

Další kroky

Další informace o dotazech JMESPath najdete v kurzu JMESPath.

Další informace o dalších konceptech Azure CLI uvedených v tomto článku najdete tady: