Jak wykonywać zapytania względem danych wyjściowych polecenia interfejsu wiersza polecenia platformy Azure przy użyciu zapytania JMESPath

Interfejs wiersza polecenia platformy Azure używa parametru --query do wykonywania zapytania JMESPath na wynikach poleceń. JMESPath to język zapytań dla formatu JSON, który umożliwia wybieranie i modyfikowanie danych z danych wyjściowych interfejsu wiersza polecenia.

Wszystkie polecenia w interfejsie wiersza polecenia platformy Azure obsługują --query parametr . W tym artykule opisano sposób korzystania z funkcji JMESPath i przedstawiono przykłady zapytań. Dowiedz się więcej na temat pojęć JMESPath, które są przydatne do wykonywania zapytań na karcie pojęcia. Zobacz przykłady zapytań JMESPath na karcie przykłady.

Interfejs wiersza polecenia platformy Azure używa zapytań do wybierania i modyfikowania danych wyjściowych poleceń interfejsu wiersza polecenia platformy Azure. Zapytania są wykonywane po stronie klienta w zwracanym obiekcie JSON polecenia interfejsu wiersza polecenia platformy Azure przed dowolnym formatowaniem wyświetlania.

Znaki ucieczki potrzebne w zapytaniach różnią się w różnych środowiskach. Zaleca się uruchamianie zapytań w usłudze Azure Cloud Shell lub cmd, ponieważ te powłoki wymagają mniejszej liczby znaków ucieczki. Aby upewnić się, że przykłady zapytań są poprawne składniowo, wybierz kartę dla używanej powłoki.

Wyniki interfejsu wiersza polecenia słownika i listy

Wyniki polecenia interfejsu wiersza polecenia są najpierw traktowane jako dane JSON dla zapytań, nawet jeśli format wyjściowy jest czymś innym niż JSON. Wyniki interfejsu wiersza polecenia to tablica JSON lub słownik. Tablice to sekwencje obiektów, które można indeksować, a słowniki są nieurządkowanym obiektami, do których uzyskuje się dostęp za pomocą kluczy.

Jest to przykład tablicy:

[ 
  1,
  2,
  3
]

Jest to przykład słownika:

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

Polecenia, które mogą zwracać więcej niż jeden obiekt, zwracają tablicę, a polecenia, które zawsze zwracają tylko jeden obiekt, zwracają słownik.

Pobieranie właściwości w słowniku

Praca z wynikami słownika pozwala uzyskać dostęp do właściwości z najwyższego poziomu przy użyciu tylko klucza. Znak . (podexpression) służy do uzyskiwania dostępu do właściwości zagnieżdżonych słowników. Przed wprowadzeniem zapytań zapoznaj się z niezmodyfikowanymi danymi wyjściowymi polecenia az vm show :

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

Polecenie zwraca słownik. Część zawartości została pominięta.

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

Następujące polecenie pobiera klucze publiczne SSH autoryzowane do nawiązywania połączenia z maszyną wirtualną przez dodanie zapytania:

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

W ciągach zapytania jest rozróżniana wielkość liter. Na przykład zmiana wartości "osProfile" na "OsProfile" w poprzednim zapytaniu nie zwraca prawidłowych wyników.

Pobieranie wielu wartości

Aby uzyskać więcej niż jedną właściwość, umieść wyrażenia rozdzielone przecinkami w nawiasach kwadratowych [ ] ( lista wielowybierz). Następujące polecenie pobiera nazwę maszyny wirtualnej, użytkownika administratora i klucz SSH jednocześnie:

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

Te wartości są wyświetlane w tablicy wyników w kolejności podanej w zapytaniu. Ponieważ wynik jest tablicą, nie ma żadnych kluczy skojarzonych z wynikami. Aby uzyskać słownik zamiast tablicy, zobacz następną sekcję.

Zmienianie nazwy właściwości w zapytaniu

Aby uzyskać słownik zamiast tablicy podczas wykonywania zapytań dotyczących wielu wartości, użyj operatora (skrótu wielokrotnego { } wyboru). Format skrótu wielokrotnego wyboru to {displayName:JMESPathExpression, ...}. displayName jest ciągiem wyświetlanym w danych wyjściowych i JMESPathExpression jest wyrażeniem JMESPath do obliczenia. Zmodyfikuj przykład z ostatniej sekcji, zmieniając listę wielowybierz na skrót:

Uwaga

Jeśli zdecydujesz się używać spacji w nowej nazwie kolumny, na przykład VM name zamiast VMName, reguły cytowania zmieniają się zarówno w powłoce Bash, jak i programie PowerShell. Przykłady można znaleźć w artykule Pass spaces in Azure CLI parameters (Przestrzenie przekazywane w parametrach interfejsu wiersza polecenia platformy Azure).

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

Pobieranie właściwości w tablicy

Tablica nie ma własnych właściwości, ale można ją indeksować. Ta funkcja jest wyświetlana w ostatnim przykładzie z wyrażeniem publicKeys[0], które pobiera pierwszy element tablicy publicKeys . Nie ma gwarancji, że dane wyjściowe interfejsu wiersza polecenia są uporządkowane, więc unikaj używania indeksowania, chyba że masz pewność, że zamówienie lub nie obchodzi tego, który element otrzymasz. Aby uzyskać dostęp do właściwości elementów w tablicy, należy wykonać jedną z dwóch operacji: spłaszczanie lub filtrowanie. W tej sekcji opisano sposób spłaszczenia tablicy.

Spłaszczanie tablicy odbywa się za [] pomocą operatora JMESPath. Wszystkie wyrażenia po operatorze [] są stosowane do każdego elementu w bieżącej tablicy. Jeśli [] pojawi się na początku zapytania, spłaszcza wynik polecenia interfejsu wiersza polecenia. Wyniki az vm list można sprawdzić za pomocą tej funkcji. Następujące zapytanie pobiera nazwę, system operacyjny i nazwę administratora dla każdej maszyny wirtualnej w grupie zasobów:

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

Każdą tablicę można spłaszczać, a nie tylko wynik najwyższego poziomu zwrócony przez polecenie . W ostatniej sekcji wyrażenie osProfile.linuxConfiguration.ssh.publicKeys[0].keyData zostało użyte do pobrania klucza publicznego SSH na potrzeby logowania. Aby uzyskać każdy klucz publiczny SSH, wyrażenie może zostać zapisane jako osProfile.linuxConfiguration.ssh.publicKeys[].keyData. To wyrażenie zapytania spłaszcza tablicę osProfile.linuxConfiguration.ssh.publicKeys , a następnie uruchamia keyData wyrażenie dla każdego elementu:

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

Filtrowanie tablic za pomocą wyrażeń logicznych

Druga operacja używana do pobierania danych z tablicy polega na filtrowaniu. Filtrowanie odbywa się za [?...] pomocą operatora JMESPath. Ten operator przyjmuje predykat jako jego zawartość. Predykat jest dowolną instrukcją (w tym właściwościami logicznymi), którą można ocenić na true wartość lub false. Wyrażenia, w których predykat oblicza true wartość , są uwzględniane w danych wyjściowych.

Pierwsze zapytanie pokazuje, jak wyświetlić listę nazw wszystkich subskrypcji platformy Azure połączonych z kontem, którego isDefault właściwość jest prawdziwa. W drugim i trzecim zapytaniu przedstawiono dwa różne sposoby wyświetlania listy wszystkich subskrypcji, których isDefault właściwość ma wartość 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"

Program JMESPath oferuje standardowe operatory porównania i operatory logiczne. Należą do nich<: , , <=>, >=, ==i !=. Program JMESPath obsługuje również logiczną i () lub (&&), a|| nie (!). Wyrażenia można grupować w nawiasach, co pozwala na bardziej złożone wyrażenia predykatu. Aby uzyskać szczegółowe informacje na temat predykatów i operacji logicznych, zobacz specyfikację JMESPath.

W ostatniej sekcji spłaszczono tablicę, aby uzyskać pełną listę wszystkich maszyn wirtualnych w grupie zasobów. Dzięki użyciu filtrów te dane wyjściowe mogą być ograniczone tylko do maszyn wirtualnych z systemem Linux:

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

Można również filtrować wartości liczbowe, takie jak rozmiar dysku systemu operacyjnego. W poniższym przykładzie pokazano, jak filtrować listę maszyn wirtualnych, aby wyświetlać te o rozmiarze dysku większym lub równym 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

W przypadku dużych tablic zastosowanie filtru może być szybsze przed wybraniem danych.

Ważne

W JMESPath ciągi są zawsze otoczone pojedynczymi cudzysłowymi (') lub znakami ucieczki (`). Jeśli używasz cudzysłowów podwójnych w ramach ciągu w predykacie filtru, otrzymasz puste dane wyjściowe.

Funkcje JMESPath

Program JMESPath ma również wbudowane funkcje, które umożliwiają wykonywanie bardziej złożonych zapytań i modyfikowanie danych wyjściowych zapytania. Ta sekcja koncentruje się na używaniu funkcji JMESPath do tworzenia zapytań, podczas gdy manipulowanie danymi wyjściowymi za pomocą funkcji pokazuje, jak używać funkcji do modyfikowania danych wyjściowych.

Wyrażenia są oceniane przed wywołaniem funkcji, więc same argumenty mogą być wyrażeniami JMESPath. W poniższych przykładach przedstawiono tę koncepcję przy użyciu metody contains(string, substring), która sprawdza, czy ciąg zawiera podciąg. To polecenie znajduje wszystkie maszyny wirtualne używające magazynu SSD dla dysku systemu operacyjnego:

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

Wyrażenia potoku

Podobnie jak w przypadku użycia | w wierszu polecenia, | można użyć w zapytaniach JMESPath do stosowania wyrażeń do wyników zapytania pośredniego. Możemy również użyć | polecenia , aby podzielić złożone zapytania na prostsze podwyrażenia. Aby skrócić zapytanie z poprzedniej sekcji, użyj polecenia | , aby zastosować filtr po spłaszczeniu i wybraniu danych.

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

Zobacz specyfikację JMESPath — funkcje wbudowane , aby uzyskać pełną listę funkcji.

Manipulowanie danymi wyjściowymi za pomocą funkcji

Funkcje JMESPath mają również inny cel, który ma działać na wynikach zapytania. Każda funkcja zwracająca wartość nieboolean zmienia wynik wyrażenia. Można na przykład sortować dane według wartości właściwości za pomocą sort_by(array, &sort_expression)polecenia . Program JMESPath używa specjalnego operatora , &dla wyrażeń, które powinny być oceniane później jako część funkcji. W następnym przykładzie pokazano, jak sortować listę maszyn wirtualnych według rozmiaru dysku systemu operacyjnego:

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

Zobacz specyfikację JMESPath — funkcje wbudowane , aby uzyskać pełną listę funkcji.

Formatowanie wyników zapytania

Interfejs wiersza polecenia platformy Azure używa formatu JSON jako domyślnego formatu danych wyjściowych, jednak różne formaty wyjściowe mogą lepiej odpowiadać zapytaniu w zależności od celu i wyników. Zapytania są zawsze uruchamiane na danych wyjściowych JSON , a następnie sformatowane.

Ta sekcja zawiera informacje o tsv formatowaniu i table niektórych przypadkach użycia dla każdego formatu. Aby uzyskać więcej informacji na temat formatów danych wyjściowych, zobacz Formaty danych wyjściowych dla poleceń interfejsu wiersza polecenia platformy Azure.

Format danych wyjściowych TSV

Format tsv danych wyjściowych zwraca wartości rozdzielane tabulatorami i nowymi wierszami bez dodatkowego formatowania, kluczy lub innych symboli. Ten format jest przydatny, gdy dane wyjściowe są przechowywane w parametrze i używane w innym poleceniu.

Jednym z przypadków tsv użycia formatowania są zapytania, które pobierają wartość z polecenia interfejsu wiersza polecenia, takie jak identyfikator zasobu platformy Azure lub nazwa zasobu, i przechowują wartość w lokalnej zmiennej środowiskowej. Domyślnie wyniki są zwracane w formacie JSON, co może być problemem podczas pracy z ciągami JSON, które są ujęte w " znaki. Cudzysłowy mogą nie być interpretowane przez powłokę, jeśli dane wyjściowe polecenia są bezpośrednio przypisane do zmiennej środowiskowej. Ten problem można zobaczyć w poniższym przykładzie, który przypisuje wynik zapytania do zmiennej środowiskowej:

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

Użyj tsv formatowania, jak pokazano w poniższym zapytaniu, aby zapobiec ujęciu wartości zwracanych za pomocą informacji o typie:

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

Format danych wyjściowych tabeli

Format table powoduje wyświetlanie danych wyjściowych w postaci tabeli ASCII, co ułatwia czytanie i skanowanie. Nie wszystkie pola są uwzględniane w tabeli, więc ten format jest najlepiej używany jako czytelny dla człowieka przegląd danych. Pola, które nie są uwzględnione w tabeli, nadal można filtrować jako część zapytania.

Uwaga

Niektóre klucze są filtrowane i nie są wyświetlane w widoku tabeli. Te klucze to id, type i etag. Aby wyświetlić te wartości, możesz zmienić nazwę klucza w skrótzie wielokrotnego wyboru.

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

Aby zademonstrować tę koncepcję, możemy użyć poprzedniego zapytania. Oryginalne zapytanie zwróciło obiekt JSON zawierający nazwę, system operacyjny i nazwę administratora dla każdej maszyny wirtualnej w grupie zasobów:

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

W połączeniu z formatem --output table danych wyjściowych nazwy kolumn są zgodne z wartością displayKey skrótu wielowyznakowego, co ułatwia ujmowania informacji:

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

Następne kroki

Aby dowiedzieć się więcej na temat zapytań JMESPath, zobacz Samouczek JMESPath.

Aby dowiedzieć się więcej o innych pojęciach interfejsu wiersza polecenia platformy Azure wymienionych w tym artykule, zobacz: