Köra frågor mot Azure CLI-kommandoutdata med hjälp av en JMESPath-fråga

Azure CLI använder parametern --query för att köra en JMESPath-fråga på resultatet av kommandon. JMESPath är ett frågespråk för JSON, vilket ger dig möjlighet att välja och ändra data från CLI-utdata.

Alla kommandon i Azure CLI stöder parametern --query . Den här artikeln beskriver hur du använder funktionerna i JMESPath och ger exempel på frågor. Lär dig mer om JMESPath-begrepp som är användbara för frågor under fliken Begrepp. Se exempel på JMESPath-frågor under fliken exempel.

Azure CLI använder frågor för att välja och ändra utdata från Azure CLI-kommandon. Frågor körs på klientsidan på Azure CLI-kommandots returnerade JSON-objekt innan någon visningsformatering.

De escape-tecken som behövs i frågor skiljer sig åt för olika miljöer. Vi rekommenderar att du kör frågor i Azure Cloud Shell eller cmd eftersom dessa gränssnitt kräver färre escape-tecken. För att säkerställa att frågeexemplen är syntaktiskt korrekta väljer du fliken för det gränssnitt som du använder.

Ordlista och lista CLI-resultat

CLI-kommandoresultat behandlas först som JSON för frågor, även om utdataformatet är något annat än JSON. CLI-resultat är antingen en JSON-matris eller ordlista. Matriser är sekvenser av objekt som kan indexeras och ordlistor är oordnade objekt som nås med nycklar.

Det här är ett exempel på en matris:

[ 
  1,
  2,
  3
]

Det här är ett exempel på en ordlista:

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

Kommandon som kan returnera fler än ett objekt returnerar en matris och kommandon som alltid returnerar endast ett enskilt objekt returnerar en ordlista.

Hämta egenskaper i en ordlista

När du arbetar med ordlisteresultat kan du komma åt egenskaper från den översta nivån med bara nyckeln. Tecknet . (underuttryck) används för att komma åt egenskaper för kapslade ordlistor. Innan du introducerar frågor bör du ta en titt på de oförändrade utdata från kommandot az vm show :

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

Kommandot matar ut en ordlista. En del innehåll har utelämnats.

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

Följande kommando hämtar de offentliga SSH-nycklarna som har behörighet att ansluta till den virtuella datorn genom att lägga till en fråga:

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

Frågesträngar är skiftlägeskänsliga. Om du till exempel ändrar "osProfile" till "OsProfile" i föregående fråga returneras inte rätt resultat.

Hämta flera värden

Om du vill hämta mer än en egenskap placerar du uttryck avgränsade med kommatecken inom hakparenteser (en flervalslista).[ ] Följande kommando hämtar vm-namnet, administratörsanvändaren och SSH-nyckeln på en gång:

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

Dessa värden visas i resultatmatrisen i den ordning de angavs i frågan. Eftersom resultatet är en matris finns det inga nycklar som är associerade med resultatet. Information om hur du hämtar en ordlista i stället för en matris finns i nästa avsnitt.

Byt namn på egenskaper i en fråga

Om du vill hämta en ordlista i stället för en matris när du frågar efter flera värden använder du operatorn { } (multiselect hash). Formatet för en hash för flera val är {displayName:JMESPathExpression, ...}. displayName är strängen som visas i utdata och JMESPathExpression är det JMESPath-uttryck som ska utvärderas. Ändra exemplet från det sista avsnittet genom att ändra flervalslistan till en hash:

Kommentar

Om du väljer att använda ett blanksteg i ett nytt kolumnnamn, till exempel VM name i stället för VMName, ändras reglerna för citat i både Bash och PowerShell. Exempel finns i Skicka blanksteg i Azure CLI-parametrar .

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

Hämta egenskaper i en matris

En matris har inga egna egenskaper, men den kan indexeras. Den här funktionen visas i det sista exemplet med uttrycket publicKeys[0], som hämtar det första elementet i matrisen publicKeys . Det finns ingen garanti för att CLI-utdata är ordnade, så undvik att använda indexering om du inte är säker på ordningen eller inte bryr dig om vilket element du får. Om du vill komma åt egenskaperna för element i en matris utför du en av två åtgärder: platta ut eller filtrera. Det här avsnittet beskriver hur du platta ut en matris.

En matris plattas ut med [] JMESPath-operatorn. Alla uttryck efter operatorn [] tillämpas på varje element i den aktuella matrisen. Om [] det visas i början av frågan plattas CLI-kommandoresultatet ut. Resultatet av az vm list kan inspekteras med den här funktionen. Följande fråga hämtar namnet, operativsystemet och administratörsnamnet för varje virtuell dator i en resursgrupp:

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

Alla matriser kan plattas ut, inte bara resultatet på den översta nivån som returneras av kommandot. I det sista avsnittet användes uttrycket osProfile.linuxConfiguration.ssh.publicKeys[0].keyData för att hämta den offentliga SSH-nyckeln för inloggning. För att hämta varje offentlig SSH-nyckel kan uttrycket i stället skrivas som osProfile.linuxConfiguration.ssh.publicKeys[].keyData. Det här frågeuttrycket plattar ut matrisen osProfile.linuxConfiguration.ssh.publicKeys och kör keyData sedan uttrycket på varje element:

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

Filtrera matriser med booleska uttryck

Den andra åtgärden som används för att hämta data från en matris är filtrering. Filtreringen görs med [?...] JMESPath-operatorn. Den här operatorn tar ett predikat som innehåll. Ett predikat är alla uttryck (inklusive booleska egenskaper) som kan utvärderas till antingen true eller false. Uttryck där predikatet utvärderas till true inkluderas i utdata.

Den första frågan visar hur du listar namnen på alla Azure-prenumerationer som är anslutna till ditt konto vars isDefault egenskap är sann. Den andra och tredje frågan visar två olika sätt att lista alla prenumerationer vars isDefault egenskap är falsk.

# 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 erbjuder standardjämförelse- och logiska operatorer. Dessa inkluderar <, <=, >, >=, ==och !=. JMESPath stöder också logiska och (&&) eller (||) och inte (!). Uttryck kan grupperas inom parentes, vilket möjliggör mer komplexa predikatuttryck. Fullständig information om predikat och logiska åtgärder finns i JMESPath-specifikationen.

I det sista avsnittet har du plattat ut en matris för att få en fullständig lista över alla virtuella datorer i en resursgrupp. Med hjälp av filter kan dessa utdata begränsas till endast virtuella Linux-datorer:

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

Du kan också filtrera numeriska värden, till exempel operativsystemets diskstorlek. I följande exempel visas hur du filtrerar listan över virtuella datorer så att de visas med en diskstorlek som är större än eller lika med 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

För stora matriser kan det gå snabbare att använda filtret innan du väljer data.

Viktigt!

I JMESPath omges strängar alltid av enkla citattecken (') eller escape-tecken (`). Om du använder dubbla citattecken som en del av en sträng i ett filterpredikat får du tomma utdata.

JMESPath-funktioner

JMESPath har också inbyggda funktioner som möjliggör mer komplexa frågor och för att ändra frågeutdata. Det här avsnittet fokuserar på att använda JMESPath-funktioner för att skapa frågor medan avsnittet Manipulera utdata med funktioner visar hur du använder funktioner för att ändra utdata.

Uttryck utvärderas innan funktionen anropas, så själva argumenten kan vara JMESPath-uttryck. Följande exempel visar det här konceptet med hjälp contains(string, substring)av , som kontrollerar om en sträng innehåller en delsträng. Det här kommandot hittar alla virtuella datorer som använder SSD-lagring för sin OS-disk:

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

Pipe-uttryck

Liknar hur | används på kommandoraden, | kan användas i JMESPath-frågor för att tillämpa uttryck på mellanliggande frågeresultat. Vi kan också använda | för att dela upp komplexa frågor i enklare underuttryck. Om du vill förkorta frågan från föregående avsnitt använder du | för att tillämpa filtret efter att du har plattat ut och valt data.

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

Se JMESPath-specifikationen – Inbyggda funktioner för den fullständiga listan över funktioner.

Manipulera utdata med funktioner

JMESPath-funktioner har också ett annat syfte, som är att arbeta med resultatet av en fråga. Alla funktioner som returnerar ett icke-booleskt värde ändrar resultatet av ett uttryck. Du kan till exempel sortera data efter ett egenskapsvärde med sort_by(array, &sort_expression). JMESPath använder en särskild operator, , &för uttryck som ska utvärderas senare som en del av en funktion. I nästa exempel visas hur du sorterar en vm-lista efter os-diskstorlek:

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

Se JMESPath-specifikationen – Inbyggda funktioner för den fullständiga listan över funktioner.

Formatera frågeresultat

Azure CLI använder JSON som standardutdataformat, men olika utdataformat kan passa bättre för en fråga beroende på dess syfte och resultat. Frågor körs alltid på JSON utdata först och formateras sedan.

Det här avsnittet går igenom tsv och table formaterar och vissa användningsfall för varje format. Mer information om utdataformat finns i Utdataformat för Azure CLI-kommandon.

Format för TSV-utdata

Utdataformatet tsv returnerar tab- och newline-avgränsade värden utan extra formatering, nycklar eller andra symboler. Det här formatet är användbart när utdata lagras i en parameter och används i ett annat kommando.

Ett användningsfall för tsv formatering är frågor som hämtar ett värde från ett CLI-kommando, till exempel ett Azure-resurs-ID eller resursnamn, och lagrar värdet i en lokal miljövariabel. Som standard returneras resultaten i JSON-format, vilket kan vara ett problem vid hantering av JSON-strängar som omges av " tecken. Citattecken kanske inte tolkas av gränssnittet om kommandoutdata tilldelas direkt till miljövariabeln. Det här problemet visas i följande exempel som tilldelar ett frågeresultat till en miljövariabel:

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

Använd tsv formatering, som visas i följande fråga, för att förhindra att returvärden omsluts med typinformation:

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

Format för tabellutdata

Formatet table skriver ut utdata som en ASCII-tabell, vilket gör dem enkla att läsa och söka igenom. Alla fält ingår inte i tabellen, så det här formatet används bäst som en översikt över data som kan sökas efter människor. Fält som inte ingår i tabellen kan fortfarande filtreras efter som en del av en fråga.

Kommentar

Vissa nycklar filtreras bort och skrivs inte ut i tabellvyn. De här nycklarna är id, type och etag. Om du vill se dessa värden kan du ändra nyckelnamnet i en hash med flera val.

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

Vi kan använda en tidigare fråga för att demonstrera det här konceptet. Den ursprungliga frågan returnerade ett JSON-objekt som innehåller namnet, operativsystemet och administratörsnamnet för varje virtuell dator i resursgruppen:

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

I kombination med --output table utdataformatet matchar kolumnnamnen displayKey värdet för hashen multiselect, vilket gör det enklare att skumma informationen:

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

Nästa steg

Mer information om JMESPath-frågor finns i JMESPath-självstudie.

Mer information om andra Azure CLI-begrepp som nämns i den här artikeln finns i: