Fråga Azure CLI-kommandoutdataQuery Azure CLI command output

Azure CLI använder argumentet --query för att utföra en JMESPath-fråga på resultaten från kommandon.The Azure CLI uses the --query argument to execute a JMESPath query on the results of commands. JMESPath är ett frågespråk för JSON, vilket ger dig möjlighet att välja och ändra data från CLI-utdata.JMESPath is a query language for JSON, giving you the ability to select and modify data from CLI output. Frågor körs på JSON-utdata innan formateringen visas.Queries are executed on the JSON output before any display formatting.

Argumentet --query stöds av alla kommandon i Azure CLI.The --query argument is supported by all commands in the Azure CLI. Den här artikeln beskriver hur du använder funktionerna i JMESPath med en serie små, enkla exempel.This article covers how to use the features of JMESPath with a series of small, simple examples.

Resultat för ord listor och list CLIDictionary and list CLI results

Även om du använder ett annat format än JSON behandlas CLI-kommandon först som JSON för frågor.Even when using an output format other than JSON, CLI command results are first treated as JSON for queries. CLI-resultat är antingen en JSON-matris eller en ord lista.CLI results are either a JSON array or dictionary. Matriser är sekvenser med objekt som kan indexeras, och ord listor är osorterade objekt som nås med nycklar.Arrays are sequences of objects that can be indexed, and dictionaries are unordered objects accessed with keys. Kommandon som kan returnera fler än ett objekt returnerar en matris och kommandon som alltid returnerar ett enda objekt returnerar en ord lista.Commands that could return more than one object return an array, and commands that always return only a single object return a dictionary.

Hämta egenskaper i en ord listaGet properties in a dictionary

Om du arbetar med ord listans resultat kan du komma åt egenskaper från den översta nivån med bara nyckeln.Working with dictionary results, you can access properties from the top level with just the key. (Subexpress)-specialtecknet används för att få åtkomst till egenskaper för kapslade ord listor. .The . (subexpression) character is used to access properties of nested dictionaries. Innan du påbörjar frågor ska du ta en titt på den oförändrade az vm show utmatningen av kommandot:Before introducing queries, take a look at the unmodified output of the az vm show command:

az vm show -g QueryDemo -n TestVM -o json

Kommandot kommer att resultera i en ord lista.The command will output a dictionary. En del innehåll har utelämnats.Some content has been omitted.

{
  "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-nycklar som har behörighet att ansluta till den virtuella datorn genom att lägga till en fråga:The following command gets the SSH public keys authorized to connect to the VM by adding a query:

az vm show -g QueryDemo -n TestVM --query osProfile.linuxConfiguration.ssh.publicKeys -o json
[
  {
    "keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso",
    "path": "/home/azureuser/.ssh/authorized_keys"
  }
]

Hämta ett enda värdeGet a single value

Ett vanligt fall är att du bara behöver hämta ett värde från ett CLI-kommando, till exempel ett Azure-resurs-ID, ett resurs namn, ett användar namn eller ett lösen ord.A common case is that you need to only get one value out of a CLI command, such as an Azure resource ID, a resource name, a username, or a password. I så fall vill du också ofta lagra värdet i en lokal miljö variabel.In that case, you also often want to store the value in a local environment variable. Om du vill hämta en enskild egenskap måste du först se till att du bara får en egenskap utanför frågan.To get a single property, first make sure that you're only getting one property out of the query. Ändra det sista exemplet så att endast administratörs användar namnet hämtas:Modifying the last example to get only the admin username:

az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o json
"azureuser"

Detta ser ut som ett giltigt enskilt värde, men Observera att " tecknen returneras som en del av utdata.This looks like a valid single value, but note that the " characters are returned as part of the output. Detta anger att objektet är en JSON-sträng.This indicates that the object is a JSON string. Det är viktigt att Observera att när du tilldelar det här värdet direkt som utdata från kommandot till en miljö variabel, kanske inte citat tecknen tolkas av gränssnittet:It's important to note that when you assign this value directly as output from the command to an environment variable, the quotes may not be interpreted by the shell:

USER=$(az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o json)
echo $USER
"azureuser"

Det här är nästan verkligen vad du vill.This is almost certainly not what you want. I detta fall vill du använda ett utdataformat som inte omger returnerade värden med typ information.In this case, you want to use an output format which doesn't enclose returned values with type information. Det bästa alternativet för utdata som CLI erbjuder för det här ändamålet är tsv, Tabbavgränsade värden.The best output option that the CLI offers for this purpose is tsv, tab-separated values. Vid hämtning av ett värde som bara är ett enda värde (inte en ord lista eller lista), tsv garanteras utdata till citat tecken.In particular, when retrieving a value that's only a single value (not a dictionary or list), tsv output is guaranteed to be unquoted.

az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o tsv
azureuser

Mer information om tsv utdataformat finns i utdataformat-TSV utdataformatFor more information about the tsv output format, see Output formats - TSV output format

Hämta flera värdenGet multiple values

Om du vill hämta mer än en egenskap ska du placera uttryck inom [ ] hakparenteser (en lista över flera val) som en kommaavgränsad lista.To get more than one property, put expressions in square brackets [ ] (a multiselect list) as a comma-separated list. För att hämta det virtuella dator namnet, administratörs användaren och SSH-nyckeln samtidigt använder du kommandot:To get the VM name, admin user, and SSH key all at once use the command:

az vm show -g QueryDemo -n TestVM --query '[name, osProfile.adminUsername, osProfile.linuxConfiguration.ssh.publicKeys[0].keyData]' -o json
[
  "TestVM",
  "azureuser",
  "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
]

Dessa värden visas i resultat mat ris i den ordning som de angavs i frågan.These values are listed in the result array in the order they were given in the query. Eftersom resultatet är en matris finns det inga nycklar kopplade till resultaten.Since the result is an array, there are no keys associated with the results.

Byt namn på egenskaper i en frågaRename properties in a query

Om du vill hämta en ord lista i stället för en matris vid frågor om flera värden { } använder du operatorn (MultiSelect hash).To get a dictionary instead of an array when querying for multiple values, use the { } (multiselect hash) operator. Formatet för en hash med MultiSelect är {displayName:JMESPathExpression, ...}.The format for a multiselect hash is {displayName:JMESPathExpression, ...}. displayNameär den sträng som visas i utdata och JMESPathExpression är det JMESPath-uttryck som ska utvärderas.displayName will be the string shown in output, and JMESPathExpression is the JMESPath expression to evaluate. Ändra exemplet från det sista avsnittet genom att ändra listan över MultiSelect till en hash:Modifying the example from the last section by changing the multiselect list to a hash:

az vm show -g QueryDemo -n TestVM --query '{VMName:name, admin:osProfile.adminUsername, sshKey:osProfile.linuxConfiguration.ssh.publicKeys[0].keyData }' -o json
{
  "VMName": "TestVM",
  "admin": "azureuser",
  "ssh-key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
}

Hämta egenskaper i en matrisGet properties in an array

En matris har inga egna egenskaper, men den kan indexeras.An array has no properties of its own, but it can be indexed. Den här funktionen visas i det sista exemplet med uttrycket publicKeys[0], som hämtar det första elementet publicKeys i matrisen.This feature is shown in the last example with the expression publicKeys[0], which gets the first element of the publicKeys array. Inga säkerhets-CLI-utdata beställs, så undvik att använda indexering om du inte är säker på ordern eller inte bryr dig om det element som du får.There's no guarantee CLI output is ordered, so avoid using indexing unless you're sure of the order or don't care what element you get. För att få åtkomst till egenskaperna för element i en matris utför du en av två åtgärder: förenkling och filtrering.To access the properties of elements in an array, you do one of two operations: flattening and filtering. Det här avsnittet beskriver hur du fören klar en matris.This section covers how to flatten an array.

Att [] förenkla en matris görs med JMESPath-operatorn.Flattening an array is done with the [] JMESPath operator. Alla uttryck efter [] att operatorn har använts för varje element i den aktuella matrisen.All expressions after the [] operator are applied to each element in the current array. Om [] visas i början av frågan, utjämnas kommando resultatet av cli.If [] appears at the start of the query, it flattens the CLI command result. Resultatet av az vm list kan granskas med den här funktionen.The results of az vm list can be inspected with this feature. Så här hämtar du namn, operativ system och administratörs namn för varje virtuell dator i en resurs grupp:To get the name, OS, and administrator name for each VM in a resource group:

az vm list -g QueryDemo --query '[].{Name:name, OS:storageProfile.osDisk.osType, admin:osProfile.adminUsername}' -o json
[
  {
    "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 kolumn namnen displayKey med värdet för MultiSelect-hash:When combined with the --output table output format, the column names match up with the displayKey value of the multiselect hash:

az vm list -g 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

Anteckning

Vissa nycklar filtreras bort och skrivs inte ut i tabellvyn.Certain keys are filtered out and not printed in the table view. De här nycklarna är id, type och etag.These keys are id, type, and etag. Om du vill se dessa värden kan du ändra nyckel namnet i en MultiSelect-hash.To see these values, you can change the key name in a multiselect hash.

az vm show -g QueryDemo -n TestVM --query "{objectID:id}" -o table

En matris kan förenklas, inte bara det resultat på den översta nivån som returneras av kommandot.Any array can be flattened, not just the top-level result returned by the command. 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.In the last section, the expression osProfile.linuxConfiguration.ssh.publicKeys[0].keyData was used to get the SSH public key for sign-in. Om du vill hämta varje Offentlig SSH-nyckel kan uttrycket i stället skrivas som osProfile.linuxConfiguration.ssh.publicKeys[].keyData.To get every SSH public key, the expression could instead be written as osProfile.linuxConfiguration.ssh.publicKeys[].keyData. Detta frågeuttryck fören osProfile.linuxConfiguration.ssh.publicKeys klar matrisen och keyData kör sedan uttrycket för varje element:This query expression flattens the osProfile.linuxConfiguration.ssh.publicKeys array, and then runs the keyData expression on each element:

az vm show -g QueryDemo -n TestVM --query '{VMName:name, admin:osProfile.adminUsername, sshKeys:osProfile.linuxConfiguration.ssh.publicKeys[].keyData }' -o json
{
  "VMName": "TestVM",
  "admin": "azureuser",
  "sshKeys": [
    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso\n"
  ]
}

Filtrera matriserFilter arrays

Den andra åtgärden som används för att hämta data från en matris är filtrering.The other operation used to get data from an array is filtering. Filtrering görs med [?...] JMESPath-operatorn.Filtering is done with the [?...] JMESPath operator. Den här operatorn tar ett predikat som dess innehåll.This operator takes a predicate as its contents. Ett predikat är en instruktion som kan utvärderas till antingen true eller false.A predicate is any statement that can be evaluated to either true or false. Uttryck där predikatet utvärderas till true inkluderas i utdata.Expressions where the predicate evaluates to true are included in the output.

JMESPath erbjuder standard jämförelse och logiska operatorer.JMESPath offers the standard comparison and logical operators. Dessa inkluderar < <=, ,,>=, och .!= > ==These include <, <=, >, >=, ==, and !=. JMESPath stöder även logiska och (&&), eller (||), och inte (!).JMESPath also supports logical and (&&), or (||), and not (!). Uttryck kan grupperas inom parentes, vilket tillåter mer komplexa predikat.Expressions can be grouped within parenthesis, allowing for more complex predicate expressions. Fullständig information om predikat och logiska åtgärder finns i JMESPath-specifikationen.For the full details on predicates and logical operations, see the JMESPath specification.

I det sista avsnittet utplattades en matris för att hämta den fullständiga listan över alla virtuella datorer i en resurs grupp.In the last section, we flattened an array to get the complete list of all VMs in a resource group. Med hjälp av filter kan dessa utdata begränsas till endast virtuella Linux-datorer:Using filters, this output can be restricted to only Linux VMs:

az vm list -g QueryDemo --query "[?storageProfile.osDisk.osType=='Linux'].{Name:name,  admin:osProfile.adminUsername}" --output table
Name    Admin
------  ---------
Test-2  sttramer
TestVM  azureuser

Viktigt

I JMESPath är strängarna alltid omgiven av enkla citat tecken'().In JMESPath, strings are always surrounded by single quotes ('). Om du använder dubbla citat tecken som en del av en sträng i ett filter-predikat får du tomma utdata.If you use double quotes as part of a string in a filter predicate, you'll get empty output.

JMESPath har också inbyggda funktioner som kan vara till hjälp vid filtrering.JMESPath also has built-in functions that can help with filtering. En sådan funktion är contains(string, substring), som kontrollerar om en sträng innehåller en under sträng.One such function is contains(string, substring), which checks to see if a string contains a substring. Uttryck utvärderas innan funktionen anropas, så det första argumentet kan vara ett fullständigt JMESPath-uttryck.Expressions are evaluated before calling the function, so the first argument can be a full JMESPath expression. I nästa exempel hittas alla virtuella datorer som använder SSD-lagring för sin OS-disk:The next example finds all VMs using SSD storage for their OS disk:

az vm list -g QueryDemo --query "[?contains(storageProfile.osDisk.managedDisk.storageAccountType,'SSD')].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType}" -o json
[
  {
    "Name": "TestVM",
    "Storage": "StandardSSD_LRS"
  },
  {
    "Name": "WinTest",
    "Storage": "StandardSSD_LRS"
  }
]

Den här frågan är lite lång.This query is a little long. storageProfile.osDisk.managedDisk.storageAccountType Nyckeln nämns två gånger och återanvänds i utdata.The storageProfile.osDisk.managedDisk.storageAccountType key is mentioned twice, and rekeyed in the output. Ett sätt att förkorta det är att tillämpa filtret efter förenkling och markering av data.One way to shorten it is to apply the filter after flattening and selecting data.

az vm list -g QueryDemo --query "[].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType}[?contains(Storage,'SSD')]" -o json
[
  {
    "Name": "TestVM",
    "Storage": "StandardSSD_LRS"
  },
  {
    "Name": "WinTest",
    "Storage": "StandardSSD_LRS"
  }
]

För stora matriser kan det gå snabbare att använda filtret innan du väljer data.For large arrays, it may be faster to apply the filter before selecting data.

Se JMESPath-specifikationen – inbyggda funktioner för den fullständiga listan med funktioner.See the JMESPath specification - Built-in Functions for the full list of functions.

Ändra utdataChange output

JMESPath-funktioner har också ett annat syfte, som är att använda resultatet av en fråga.JMESPath functions also have another purpose, which is to operate on the results of a query. En funktion som returnerar ett värde som inte är booleskt ändrar resultatet av ett uttryck.Any function that returns a non-boolean value changes the result of an expression. Du kan till exempel sortera data efter ett egenskaps värde med sort_by(array, &sort_expression).For example, you can sort data by a property value with sort_by(array, &sort_expression). JMESPath använder en speciell Operator, &för uttryck som ska utvärderas senare som en del av en funktion.JMESPath uses a special operator, &, for expressions that should be evaluated later as part of a function. I nästa exempel visas hur du sorterar en VM-lista efter OS-disk storlek:The next example shows how to sort a VM list by OS disk size:

az vm list -g QueryDemo --query "sort_by([].{Name:name, Size:storageProfile.osDisk.diskSizeGb}, &Size)" --output table
Name     Size
-------  ------
TestVM   30
Test-2   32
WinTest  127

Se JMESPath-specifikationen – inbyggda funktioner för den fullständiga listan med funktioner.See the JMESPath specification - Built-in Functions for the full list of functions.

Experimentera med frågor interaktivtExperiment with queries interactively

För att börja experimentera med JMESPath erbjuder JMESPath-Terminal python- paketet en interaktiv miljö för att arbeta med frågor.To start experimenting with JMESPath, the JMESPath-terminal Python package offers an interactive environment to work with queries. Data är skickasa som indata och frågar sedan och körs i redigeraren.Data is piped as input, and then queries are written and run in the editor.

pip install jmespath-terminal
az vm list --output json | jpterm