Jak wykonywać zapytania dotyczące 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 w 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.

Parametr --query jest obsługiwany przez wszystkie polecenia w interfejsie wiersza polecenia platformy Azure. W tym artykule opisano sposób używania 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 po zwróconym obiekcie JSON polecenia interfejsu wiersza polecenia platformy Azure przed każdym wyświetlaniem formatowania.

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

Wyniki interfejsu wiersza polecenia słownika i listy

Nawet w przypadku korzystania z formatu wyjściowego innego niż JSON wyniki poleceń interfejsu wiersza polecenia są najpierw traktowane jako JSON dla zapytań. 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 dostępnymi za pomocą kluczy.

Poniżej przedstawiono przykład tablicy:

[ 
  1,
  2,
  3
]

Poniżej przedstawiono przykład słownika:

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

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

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

Praca z wynikami słownika umożliwia dostęp do właściwości z najwyższego poziomu przy użyciu tylko klucza. Znak . (subexpression) 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 wyświetli słownik. Pominięto część zawartości.

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

Należy pamiętać, że ciągi zapytania są uwzględniane wielkości liter. Na przykład zmiana wartości "osProfile" na "OsProfile" w powyższym zapytaniu nie zwróci 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ą wymienione w tablicy wyników w kolejności podanej w zapytaniu. Ponieważ wynik jest tablicą, nie ma kluczy skojarzonych z wynikami. Aby uzyskać słownik zamiast tablicy, zobacz sekcję poniżej.

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ót wielowybierz). Format skrótu wielokrotnego wyboru to {displayName:JMESPathExpression, ...}. displayName będzie ciągiem wyświetlanym w danych wyjściowych i JMESPathExpression jest wyrażeniem JMESPath do oceny. Zmodyfikowanie przykładu z ostatniej sekcji przez zmianę listy wielokrotnej wyboru na skrót:

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, dlatego unikaj używania indeksowania, chyba że masz pewność, że jest to kolejność lub nie obchodzi tego, który element otrzymasz. Aby uzyskać dostęp do właściwości elementów w tablicy, wykonaj 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"
  }
]

Dowolna tablica może być spłaszczone, 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 być zamiast tego napisane jako osProfile.linuxConfiguration.ssh.publicKeys[].keyData. To wyrażenie zapytania spłaszcza tablicę osProfile.linuxConfiguration.ssh.publicKeys , a następnie uruchamia keyData wyrażenie w każdym elemecie:

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 wartość lub truefalse. Wyrażenia, w których predykat oblicza wartość , są true 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. Drugie i trzecie zapytania pokazują 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. Za pomocą 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świetlić 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 może być szybsze zastosowanie filtru przed wybraniem danych.

Ważne

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

Funkcje JMESPath

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

Wyrażenia są oceniane przed wywołaniem funkcji, więc argumenty mogą być wyrażeniami JMESPath. W poniższych przykładach pokazano to 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 w celu zastosowania wyrażeń do wyników zapytania pośredniego. Możemy również użyć | do podzielenia złożonych zapytań na prostsze podwyrażenia. Aby skrócić zapytanie z poprzedniej sekcji, użyj polecenia | , aby zastosować filtr po spłaszaniu 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 polega na działaniu na wynikach zapytania. Każda funkcja zwracająca wartość nielogiczną zmienia wynik wyrażenia. Na przykład można sortować dane według wartości właściwości za pomocą polecenia sort_by(array, &sort_expression). Program JMESPath używa specjalnego operatora , dla wyrażeń, &które powinny być oceniane później w ramach 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 danych wyjściowych mogą lepiej odpowiadać zapytaniu w zależności od celu i wyników. Należy pamiętać, że zapytania są zawsze uruchamiane w danych wyjściowych JSON , a następnie sformatowane.

W tej sekcji zostaną zastąpione tsv i table sformatowane oraz niektóre przypadki użycia dla każdego formatu. Aby uzyskać więcej informacji na temat formatów danych wyjściowych, zobacz Formaty wyjściowe poleceń interfejsu wiersza polecenia platformy Azure.

Format danych wyjściowych TSV

Format danych wyjściowych tsv zwraca wartości rozdzielane tabulatorami i znakami nowego wiersza bez dodatkowego formatowania, kluczy i innych symboli. Jest to przydatne, gdy dane wyjściowe są używane przez inne polecenie.

Jednym z przypadków użycia formatowania tsv 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. Może to być problem podczas czynienia 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. Można to 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"

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

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 przegląd danych z możliwością przeszukiwania przez człowieka. 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 to zademonstrować, 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 wielokrotnego wyboru, co ułatwia wprowadzanie 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 na temat innych pojęć związanych z interfejsem wiersza polecenia platformy Azure wymienionych w tym artykule, zobacz: