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: