Sdílet prostřednictvím


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 pro JSON, který umožňuje vybrat a upravit data z výstupu rozhraní příkazového řádku.

Všechny příkazy v Azure CLI podporují --query parametr. Tento článek popisuje, jak používat funkce JMESPath a uvádí 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ém objektu JSON příkazu Azure CLI před jakýmkoliv formátováním zobrazení.

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

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

Výsledky příkazů rozhraní příkazového řádku se nejprve považují za JSON pro dotazy, i když je výstupní formát něco jiného než JSON. Výsledky rozhraní příkazového řádku jsou pole JSON nebo slovník. Pole jsou posloupnosti objektů, které lze indexovat, a slovníky jsou neuspořádané objekty, ke kterým se přistupuje pomocí klíčů.

Toto je příklad pole:

[ 
  1,
  2,
  3
]

Toto je příklad slovníku:

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

Příkazy, které by mohly vrátit více než jeden objekt, vrátí pole a příkazy, které vždy vrátí 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 . (dílčí výraz) 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. Nějaký obsah byl vynechán.

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

Řetězce dotazů rozlišují malá a velká písmena. Například změna souboru osProfile na OsProfile v předchozím dotazu nevrací 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 uvedeny v dotazu. Vzhledem k tomu, že výsledkem 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 další čá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 je řetězec zobrazený ve výstupu a JMESPathExpression je výraz JMESPath, který se má vyhodnotit. Upravte příklad z posledního oddílu tak, že změníte seznam s vícenásobným výběrem na hodnotu hash:

Poznámka:

Pokud se rozhodnete použít mezeru v názvu nového sloupce, například VM name místo VMNametoho, změní se pravidla uvozování v prostředí Bash i PowerShell. Příklady najdete v tématu Předávání mezer v parametrech 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"
}

Získání vlastností v poli

Pole nemá žádné vlastní vlastnosti, ale lze ho indexovat. Tato funkce je zobrazena 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 nepoužívejte indexování, pokud si nejste jisti pořadím nebo nezajímáte, který prvek získáte. 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 po operátoru [] se použijí na každý prvek v aktuálním poli. Pokud [] se zobrazí na začátku dotazu, zploštěná výsledek příkazu rozhraní příkazového řádku. az vm list Výsledky této funkce je možné 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 jenom 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, můžete místo toho zapsat výraz jako osProfile.linuxConfiguration.ssh.publicKeys[].keyData. Tento výraz dotazu zploštěná 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 používaná k získání dat z pole se filtruje. 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 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ů. Při použití 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 zobrazovaly virtuální počítače 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 JMESPath jsou řetězce vždy obklopeny jednoduchými uvozovkami (') nebo řídicími znaky (`). Pokud jako součást řetězce v predikáte filtru použijete dvojité uvozovky, zobrazí se prázdný výstup.

Funkce JMESPath

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, jak pomocí funkcí upravit výstup.

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í tento koncept pomocí 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 svislé roury

| Podobně jako při použití v příkazovém řádku | se dají 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ů do jednodušších dílčích výrazů. Pokud chcete dotaz zkrátit 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é další účel, který slouží k práci s výsledky dotazu. Libovolná funkce, která vrací nebooleanovou hodnotu, 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. Další 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 jako výchozí výstupní formát používá JSON, ale různé formáty výstupu můžou lépe vyhovovat dotazu v závislosti na účelu a výsledcích. Dotazy se vždy spustí na výstupu JSON a pak se naformátují.

Tento oddíl se bude pro každý formát přecházet tsv a table formátovat a některé případy použití. 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í tsv formát vrátí hodnoty oddělené tabulátory a nový řádek bez dalšího formátování, klíčů nebo jiných symbolů. Tento formát je užitečný, když je výstup uložený v parametru a používá se v jiném příkazu.

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, jako je ID prostředku Azure nebo název prostředku, a ukládají hodnotu do místní proměnné prostředí. Ve výchozím nastavení se výsledky vrátí ve formátu JSON, což může být problém při práci s řetězci JSON uzavřenými ve " znacích. Uvozovky nemusí být interpretovány prostředím, pokud je výstup příkazu přímo přiřazen k proměnné prostředí. Tento problém 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"

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

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 zahrnutá 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, je stále možné 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í tohoto konceptu 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 hash s vícenásobným výběrem, což usnadňuje přeskočení 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: