Query's uitvoeren op Azure CLI-opdrachtuitvoer met behulp van een JMESPath-query

De Azure CLI gebruikt de --query parameter om een JMESPath-query uit te voeren op de resultaten van opdrachten. JMESPath is een querytaal voor JSON, zodat u gegevens uit cli-uitvoer kunt selecteren en wijzigen.

Alle opdrachten in Azure CLI ondersteunen de --query parameter. In dit artikel wordt beschreven hoe u de functies van JMESPath gebruikt en voorbeelden van query's krijgt. Meer informatie over JMESPath-concepten die handig zijn voor het uitvoeren van query's op het tabblad Concepten. Bekijk voorbeelden van JMESPath-query's op het tabblad Voorbeelden.

Azure CLI maakt gebruik van query's om de uitvoer van Azure CLI-opdrachten te selecteren en te wijzigen. Query's worden uitgevoerd aan de clientzijde van het geretourneerde JSON-object van de Azure CLI-opdracht vóór een weergaveopmaak.

De escapetekens die nodig zijn in query's verschillen voor verschillende omgevingen. Het is raadzaam om query's uit te voeren in Azure Cloud Shell of cmd, omdat voor deze shells minder escapetekens nodig zijn. Als u wilt controleren of de queryvoorbeelden syntactisch juist zijn, selecteert u het tabblad voor de shell die u gebruikt.

Cli-resultaten voor woordenlijst en lijst

Cli-opdrachtresultaten worden eerst behandeld als JSON voor query's, zelfs als de uitvoerindeling iets anders is dan JSON. CLI-resultaten zijn een JSON-matrix of -woordenlijst. Matrices zijn reeksen objecten die kunnen worden geïndexeerd en woordenlijsten zijn niet-geordende objecten die worden geopend met sleutels.

Dit is een voorbeeld van een matrix:

[ 
  1,
  2,
  3
]

Dit is een voorbeeld van een woordenlijst:

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

Opdrachten die meer dan één object kunnen retourneren, retourneren een matrix en opdrachten die altijd slechts één object retourneren, retourneren een woordenlijst.

Eigenschappen ophalen in een woordenlijst

Als u met woordenlijstresultaten werkt, hebt u toegang tot eigenschappen vanaf het hoogste niveau met alleen de sleutel. Het . teken (subexpressie) wordt gebruikt voor toegang tot eigenschappen van geneste woordenlijsten. Voordat u query's introduceert, bekijkt u de ongewijzigde uitvoer van de opdracht az vm show :

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

Met de opdracht wordt een woordenlijst uitgevoerd. Sommige inhoud is weggelaten.

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

Met de volgende opdracht worden de openbare SSH-sleutels geautoriseerd om verbinding te maken met de virtuele machine door een query toe te voegen:

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

Queryreeksen zijn hoofdlettergevoelig. Als u bijvoorbeeld osProfile wijzigt in OsProfile in de vorige query, worden de juiste resultaten niet geretourneerd.

Meerdere waarden ophalen

Als u meer dan één eigenschap wilt ophalen, plaatst u expressies gescheiden door komma's tussen vierkante haken (een lijst met meerdere selecties [ ] ). Met de volgende opdracht worden de VM-naam, de gebruiker van de beheerder en de SSH-sleutel in één keer ophaalt:

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

Deze waarden worden weergegeven in de resultaatmatrix in de volgorde waarin ze zijn opgegeven in de query. Omdat het resultaat een matrix is, zijn er geen sleutels gekoppeld aan de resultaten. Zie de volgende sectie als u een woordenlijst wilt ophalen in plaats van een matrix.

De naam van eigenschappen in een query wijzigen

Als u een woordenlijst wilt ophalen in plaats van een matrix bij het uitvoeren van query's op meerdere waarden, gebruikt u de { } operator (multiselect hash). De indeling voor een hash met meerdere selecties is {displayName:JMESPathExpression, ...}. displayName is de tekenreeks die wordt weergegeven in de uitvoer en JMESPathExpression is de JMESPath-expressie die moet worden geëvalueerd. Wijzig het voorbeeld uit de laatste sectie door de lijst met meerdere selecties te wijzigen in een hash:

Notitie

Als u ervoor kiest om een spatie in een nieuwe kolomnaam te gebruiken, zoals VM name in plaats van VMName, worden de aanhalingsregels in zowel Bash als PowerShell gewijzigd. Zie Spaties doorgeven in Azure CLI-parameters voor voorbeelden.

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

Eigenschappen ophalen in een matrix

Een matrix heeft geen eigen eigenschappen, maar kan worden geïndexeerd. Deze functie wordt weergegeven in het laatste voorbeeld met de expressie publicKeys[0], waarmee het eerste element van de publicKeys matrix wordt ophaalt. Er is geen garantie dat CLI-uitvoer is geordend, dus vermijd het gebruik van indexering, tenzij u zeker weet van de volgorde of het niet uitmaakt welk element u krijgt. Voor toegang tot de eigenschappen van elementen in een matrix voert u een van de volgende twee bewerkingen uit: platmaken of filteren. In deze sectie wordt beschreven hoe u een matrix plat kunt maken.

Het platmaken van een matrix wordt uitgevoerd met de [] JMESPath-operator. Alle expressies nadat de [] operator is toegepast op elk element in de huidige matrix. Als [] deze wordt weergegeven aan het begin van de query, wordt het resultaat van de CLI-opdracht platgemaakt. De resultaten van az vm list deze functie kunnen worden geïnspecteerd. Met de volgende query worden de naam, het besturingssysteem en de beheerdersnaam voor elke VIRTUELE machine in een resourcegroep opgeslagen:

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

Elke matrix kan worden afgevlakt, niet alleen het resultaat op het hoogste niveau dat door de opdracht wordt geretourneerd. In de laatste sectie is de expressie osProfile.linuxConfiguration.ssh.publicKeys[0].keyData gebruikt om de openbare SSH-sleutel voor aanmelding op te halen. Als u elke openbare SSH-sleutel wilt ophalen, kan de expressie in plaats daarvan worden geschreven als osProfile.linuxConfiguration.ssh.publicKeys[].keyData. Met deze queryexpressie wordt de osProfile.linuxConfiguration.ssh.publicKeys matrix platgemaakt en wordt vervolgens de keyData expressie op elk element uitgevoerd:

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

Matrices filteren met Boole-expressies

De andere bewerking die wordt gebruikt om gegevens op te halen uit een matrix, is filteren. Filteren wordt uitgevoerd met de [?...] JMESPath-operator. Deze operator neemt een predicaat als inhoud. Een predicaat is een instructie (inclusief Booleaanse eigenschappen) die kunnen worden geëvalueerd op of truefalse. Expressies waarin het predicaat wordt geëvalueerd true , worden opgenomen in de uitvoer.

De eerste query laat zien hoe u de namen weergeeft van alle Azure-abonnementen die zijn verbonden met uw account waarvan isDefault de eigenschap waar is. In de tweede en derde query worden twee verschillende manieren weergegeven om alle abonnementen weer te geven waarvan isDefault de eigenschap onwaar is.

# 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 biedt de standaardvergelijking en logische operators. Dit zijn onder andere , , , , en !===. >=><=< JMESPath ondersteunt ook logische en (&&) of (||) en niet (!). Expressies kunnen worden gegroepeerd tussen haakjes, waardoor complexere predicaatexpressies mogelijk zijn. Zie de JMESPath-specificatie voor meer informatie over predicaten en logische bewerkingen.

In de laatste sectie hebt u een matrix afgevlakt om de volledige lijst met alle VM's in een resourcegroep op te halen. Met het gebruik van filters kan deze uitvoer worden beperkt tot alleen Linux-VM's:

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

U kunt ook numerieke waarden filteren, zoals de schijfgrootte van het besturingssysteem. In het volgende voorbeeld ziet u hoe u de lijst met VM's filtert om vm's weer te geven met een schijfgrootte die groter is dan of gelijk is aan 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

Voor grote matrices is het mogelijk sneller om het filter toe te passen voordat u gegevens selecteert.

Belangrijk

In JMESPath worden tekenreeksen altijd omgeven door enkele aanhalingstekens (') of escapetekens (`). Als u dubbele aanhalingstekens gebruikt als onderdeel van een tekenreeks in een filterpredicaat, krijgt u lege uitvoer.

JMESPath-functies

JMESPath heeft ook ingebouwde functies waarmee complexere query's kunnen worden uitgevoerd en waarmee queryuitvoer kan worden gewijzigd. Deze sectie is gericht op het gebruik van JMESPath-functies om query's te maken terwijl de sectie Manipulating output with functions laat zien hoe u functies kunt gebruiken om de uitvoer te wijzigen.

Expressies worden geëvalueerd voordat de functie wordt aangeroepen, zodat argumenten zelf JMESPath-expressies kunnen zijn. In de volgende voorbeelden ziet u dit concept met behulp van contains(string, substring), waarmee wordt gecontroleerd of een tekenreeks een subtekenreeks bevat. Met deze opdracht worden alle VM's gevonden die SSD-opslag gebruiken voor hun besturingssysteemschijf:

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

Pijpexpressies

Net zoals | in de opdrachtregel kan | worden gebruikt in JMESPath-query's om expressies toe te passen op tussenliggende queryresultaten. We kunnen ook complexe | query's opsplitsen in eenvoudigere subexpressies. Als u de query uit de vorige sectie wilt inkorten, gebruikt | u om het filter toe te passen na het platmaken en selecteren van gegevens.

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

Zie de JMESPath-specificatie - ingebouwde functies voor de volledige lijst met functies.

Uitvoer bewerken met functies

JMESPath-functies hebben ook een ander doel, namelijk het uitvoeren van de resultaten van een query. Elke functie die een niet-Booleaanse waarde retourneert, verandert het resultaat van een expressie. U kunt bijvoorbeeld gegevens sorteren op een eigenschapswaarde met sort_by(array, &sort_expression). JMESPath maakt gebruik van een speciale operator, &voor expressies die later moeten worden geëvalueerd als onderdeel van een functie. In het volgende voorbeeld ziet u hoe u een VM-lijst sorteert op schijfgrootte van het besturingssysteem:

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

Zie de JMESPath-specificatie - ingebouwde functies voor de volledige lijst met functies.

Queryresultaten opmaken

De Azure CLI maakt gebruik van JSON als standaarduitvoerindeling, maar verschillende uitvoerindelingen passen mogelijk beter bij een query, afhankelijk van het doel en de resultaten. Query's worden altijd eerst uitgevoerd op de JSON uitvoer en vervolgens opgemaakt.

In deze sectie worden de opmaak en table enkele gebruiksvoorbeelden voor elke indeling besprokentsv. Zie Uitvoerindelingen voor Azure CLI-opdrachten voor meer informatie over uitvoerindelingen.

TSV-uitvoer

De tsv uitvoerindeling retourneert door tabs en nieuwe regels gescheiden waarden zonder extra opmaak, toetsen of andere symbolen. Deze indeling is handig wanneer de uitvoer wordt opgeslagen in een parameter en wordt gebruikt in een andere opdracht.

Een use case voor tsv het opmaken van query's die een waarde ophalen uit een CLI-opdracht, zoals een Azure-resource-id of resourcenaam, en de waarde opslaan in een lokale omgevingsvariabele. De resultaten worden standaard geretourneerd in JSON-indeling. Dit kan een probleem zijn bij het omgaan met JSON-tekenreeksen die tussen " tekens staan. De aanhalingstekens worden mogelijk niet geïnterpreteerd door de shell als de opdrachtuitvoer rechtstreeks is toegewezen aan de omgevingsvariabele. Dit probleem wordt weergegeven in het volgende voorbeeld waarmee een queryresultaat wordt toegewezen aan een omgevingsvariabele:

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

Gebruik tsv opmaak, zoals wordt gedemonstreerd in de volgende query, om te voorkomen dat retourwaarden worden ingesloten met typegegevens:

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

Tabeluitvoer

De table-indeling genereert uitvoer als een ASCII-tabel, waardoor deze eenvoudig te lezen en te scannen is. Niet alle velden zijn opgenomen in de tabel, dus deze indeling wordt het beste gebruikt als een door mensen doorzoekbaar overzicht van gegevens. Velden die niet in de tabel zijn opgenomen, kunnen nog steeds worden gefilterd als onderdeel van een query.

Notitie

Bepaalde sleutels worden eruit gefilterd en niet opgenomen in de tabelweergave. Deze sleutels zijn id, type en etag. Als u deze waarden wilt zien, kunt u de sleutelnaam in een hash met meerdere selecties wijzigen.

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

We kunnen een eerdere query gebruiken om dit concept te demonstreren. De oorspronkelijke query heeft een JSON-object geretourneerd met de naam, het besturingssysteem en de beheerdersnaam voor elke VIRTUELE machine in de resourcegroep:

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

In combinatie met de --output table uitvoerindeling komen de kolomnamen overeen met de displayKey waarde van de multiselect-hash, zodat u de informatie gemakkelijker kunt overslaan:

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

Volgende stappen

Zie JMESPath-zelfstudie voor meer informatie over JMESPath-query's.

Zie voor meer informatie over andere Azure CLI-concepten die in dit artikel worden genoemd: