JMESPath sorgusu kullanarak Azure CLI komut çıktısını sorgulama
Azure CLI, komut sonuçlarında JMESPath sorgusu yürütmek için parametresini kullanır--query. JMESPath, CLI çıkışından veri seçme ve değiştirme olanağı sağlayan bir JSON sorgu dilidir.
--query parametresi Azure CLI'daki tüm komutlar tarafından desteklenir. Bu makalede JMESPath özelliklerinin nasıl kullanılacağı anlatılarak sorgu örnekleri verilmektedir. Kavramlar sekmesinin altında sorgulama için yararlı olan JMESPath kavramları hakkında bilgi edinin. Örnekler sekmesinin altında JMESPath sorgularının örneklerine bakın.
Azure CLI, Azure CLI komutlarının çıkışını seçmek ve değiştirmek için sorguları kullanır. Sorgular, herhangi bir görüntüleme biçimlendirmesi öncesinde Azure CLI komutunun döndürülen JSON nesnesinde istemci tarafında yürütülür.
Sorgularda gereken kaçış karakterleri farklı ortamlar için farklılık gösterir. Bu kabuklar daha az kaçış karakteri gerektirdiğinden Azure CloudShell veya cmd'de sorgu çalıştırmanız önerilir. Sorgu örneklerinin yazımsal olarak doğru olduğundan emin olmak için kullandığınız kabuğun sekmesini seçin.
Sözlük ve liste CLI sonuçları
JSON dışında bir çıkış biçimi kullanılırken bile, CLI komut sonuçları sorgular için ilk olarak JSON olarak kabul edilir. CLI sonuçları bir JSON dizisi veya sözlüktür. Diziler dizine alınabilen nesne dizileridir ve sözlükler anahtarlarla erişilen sıralanmamış nesnelerdir.
Aşağıda bir dizi örneği verilmiştir:
[
1,
2,
3
]
Aşağıda bir sözlük örneği verilmiştir:
{
"isRunning": false,
"time": "12:00",
"number": 1
}
Birden fazla nesne döndürebilen komutlar bir dizi döndürür ve her zaman yalnızca tek bir nesne döndüren komutlar bir sözlük döndürür.
Sözlükte özellikleri alma
Sözlük sonuçlarıyla çalışırken, özelliklere yalnızca anahtarla en üst düzeyden erişebilirsiniz. . İç içe sözlüklerin özelliklerine erişmek için (alt ifade) karakteri kullanılır. Sorguları kullanıma sunmadan önce az vm show komutunun değiştirilmemiş çıktısını gözden geçirin:
az vm show --resource-group QueryDemo --name TestVM
Komutu bir sözlük çıkışı oluşturur. Bazı içerikler atlandı.
{
"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
},
....
}
Aşağıdaki komut, bir sorgu ekleyerek VM'ye bağlanmak için yetkilendirilmiş SSH ortak anahtarlarını alır:
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"
}
]
Sorgu dizelerinin büyük/küçük harfe duyarlı olduğunu unutmayın. Örneğin, yukarıdaki sorguda 'osProfile' öğesini 'OsProfile' olarak değiştirmek doğru sonuçları döndürmez.
Birden çok değer alma
Birden fazla özellik almak için ifadeleri virgülle ayırarak köşeli ayraç içine [ ] ( çoklu seçim listesi) yerleştirin. Aşağıdaki komut VM adını, yönetici kullanıcıyı ve SSH anahtarını aynı anda alır:
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"
]
Bu değerler sonuç dizisinde sorguda kendilerine verilen sırayla listelenir. Sonuç bir dizi olduğundan sonuçlarla ilişkilendirilmiş anahtar yoktur. Dizi yerine sözlük almak için aşağıdaki bölüme bakın.
Sorgudaki özellikleri yeniden adlandırma
Birden çok değer sorgularken dizi yerine sözlük almak için (çoklu seçim karması) işlecini kullanın { } .
Çoklu seçim karması biçimi şeklindedir {displayName:JMESPathExpression, ...}.
displayName çıkışta gösterilen dize olur ve JMESPathExpression değerlendirilecek JMESPath ifadesidir. Çoklu seçim listesini karma olarak değiştirerek son bölümdeki örneği değiştirme:
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"
}
Dizideki özellikleri alma
Bir dizi kendi özelliklerine sahip değildir, ancak dizinlenebilir. Bu özellik, dizinin ilk öğesini publicKeys alan ifadesiyle publicKeys[0]son örnekte gösterilmiştir. CLI çıkışının sıralandığı garanti edilmez, bu nedenle sıralamadan emin değilseniz veya hangi öğeyi aldığınızı dikkate almadığınız sürece dizin oluşturmayı kullanmaktan kaçının. Dizideki öğelerin özelliklerine erişmek için iki işlemden birini yaparsınız: düzleştirme veya filtreleme. Bu bölümde bir dizinin nasıl düzleştirilmiş olduğu açıklanmıştır.
Diziyi düzleştirme işlemi JMESPath işleciyle [] yapılır. işlecinden [] sonraki tüm ifadeler geçerli dizideki her öğeye uygulanır.
Sorgunun başında görünürse [] , CLI komut sonucunu düzleştirmesi gerekir. Sonuçları az vm list bu özellik ile incelenebilir.
Aşağıdaki sorgu, bir kaynak grubundaki her VM'nin adını, işletim sistemini ve yönetici adını alır:
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"
}
]
Herhangi bir dizi, yalnızca komutu tarafından döndürülen en üst düzey sonucu değil düzleştirilebilir. Son bölümde, oturum açma için SSH ortak anahtarını almak için ifadesi osProfile.linuxConfiguration.ssh.publicKeys[0].keyData kullanılmıştır. Her SSH ortak anahtarını almak için ifadesi olarak osProfile.linuxConfiguration.ssh.publicKeys[].keyDatayazılabilir.
Bu sorgu ifadesi diziyi osProfile.linuxConfiguration.ssh.publicKeys düzler ve ardından ifadeyi keyData her öğede çalıştırır:
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"
]
}
Boole ifadeleriyle dizileri filtreleme
Diziden veri almak için kullanılan diğer işlem filtrelemedir. Filtreleme JMESPath işleciyle [?...] yapılır.
Bu işleç, içeriği olarak bir koşul alır. Koşul, Boole özellikleri de dahil olmak üzere veya falseolarak değerlendirilebilen true herhangi bir deyimdir. Koşulun değerlendirildiği ifadeler true çıkışa eklenir.
İlk sorguda, özelliği true olan isDefault hesabınıza bağlı tüm Azure aboneliklerinin adlarının nasıl listeleniyor olduğu gösterilir. İkinci ve üçüncü sorgular, özelliği false olan isDefault tüm abonelikleri listelemenin iki farklı yolunu gösterir.
# 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, standart karşılaştırmayı ve mantıksal işleçleri sunar. Bunlar , , <=, >, >=ve ==``!=içerir<. JMESPath, () değil! mantıksal ve (&&) veya ()|| değerlerini de destekler. İfadeler parantez içinde gruplandırılabilir ve daha karmaşık koşul ifadelerine olanak sağlar. Koşullar ve mantıksal işlemler hakkında tüm ayrıntılar için bkz. JMESPath belirtimi.
Son bölümde, bir kaynak grubundaki tüm VM'lerin tam listesini almak için bir diziyi düzleştirmeniz gerekir. Filtreler kullanıldığında bu çıkış yalnızca Linux VM'leriyle sınırlandırılabilir:
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
İşletim sistemi disk boyutu gibi sayısal değerleri de filtreleyebilirsiniz. Aşağıdaki örnekte, 50 GB'tan büyük veya 50 GB'a eşit disk boyutuna sahip olanları görüntülemek için VM listesinin nasıl filtreleneceği gösterilmektedir.
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
Büyük diziler için, verileri seçmeden önce filtreyi uygulamak daha hızlı olabilir.
Önemli
JMESPath'te dizeler her zaman tek tırnak () veya kaçış karakterleri ('``` ``) ile çevrelenir. Filtre koşulunda bir dizenin parçası olarak çift tırnak kullanırsanız boş çıkış alırsınız.
JMESPath işlevleri
JMESPath ayrıca daha karmaşık sorgulara ve sorgu çıktısını değiştirmeye olanak sağlayan yerleşik işlevlere sahiptir. Bu bölüm, JMESPath işlevlerini kullanarak sorgu oluşturmaya odaklanırken , Çıkışı işlevlerle düzenleme bölümünde çıkışı değiştirmek için işlevlerin nasıl kullanılacağı gösterilmektedir.
İfadeler işlevi çağırmadan önce değerlendirilir, bu nedenle bağımsız değişkenlerin kendileri JMESPath ifadeleri olabilir. Aşağıdaki örneklerde, bir dizenin alt dize içerip içermediğini denetleyen kullanarak contains(string, substring)bunu gösterilmektedir. Bu komut, işletim sistemi diskleri için SSD depolama kullanan tüm VM'leri bulur:
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"
}
]
Kanal ifadeleri
Komut satırında kullanılana benzer şekilde | , | JMESPath sorgularında ara sorgu sonuçlarına ifade uygulamak için kullanılabilir. Karmaşık sorguları daha basit alt ifadelere bölmek için de kullanabiliriz | . Önceki bölümdeki sorguyu kısaltmak için, verileri düzleştirme ve seçme sonrasında filtreyi uygulamak için kullanın | .
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"
}
]
İşlevlerin tam listesi için bkz. JMESPath belirtimi - Yerleşik İşlevler .
Çıkışı işlevlerle düzenleme
JMESPath işlevlerinin bir sorgunun sonuçları üzerinde çalışmak için başka bir amacı da vardır. Boole olmayan bir değer döndüren herhangi bir işlev, ifadenin sonucunu değiştirir. Örneğin, ile sort_by(array, &sort_expression)verileri bir özellik değerine göre sıralayabilirsiniz. JMESPath, &daha sonra bir işlevin parçası olarak değerlendirilmesi gereken ifadeler için özel bir işleç kullanır. Sonraki örnekte, bir VM listesinin işletim sistemi disk boyutuna göre nasıl sıralanacağını gösterir:
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
İşlevlerin tam listesi için bkz. JMESPath belirtimi - Yerleşik İşlevler .
Sorgu sonuçlarını biçimlendirme
Azure CLI varsayılan çıkış biçimi olarak JSON kullanır, ancak farklı çıkış biçimleri amacına ve sonuçlarına bağlı olarak sorguya daha uygun olabilir. Sorguların her zaman önce çıkışta JSON çalıştırıldığını ve ardından biçimlendirildiğini unutmayın.
Bu bölümde her biçim için biçimlendirme ve table bazı kullanım örnekleri ele tsv alınacaktır. Çıkış biçimleri hakkında daha fazla bilgi için bkz. Azure CLI komutları için çıkış biçimleri.
TSV çıkış biçimi
tsv çıkış biçimi ek biçimlendirme, anahtarlar veya diğer semboller olmadan sekme ve yeni satır ile ayrılmış değerleri döndürür. Bu, çıktı başka bir komut tarafından kullanıldığında kullanışlıdır.
Biçimlendirme için tsv bir kullanım örneği, CLI komutundan Azure kaynak kimliği veya kaynak adı gibi bir değer alan ve değeri yerel bir ortam değişkeninde depolayan sorgulardır. Varsayılan olarak sonuçlar JSON biçiminde döndürülür. Bu, karakter içine alınmış " JSON dizeleriyle ilgilenirken bir sorun olabilir. Komut çıkışı doğrudan ortam değişkenine atanmışsa tırnak işaretleri kabuk tarafından yorumlanmayabilir . Bu, bir ortam değişkenine sorgu sonucu atayan aşağıdaki örnekte görülebilir:
USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername")
echo $USER
"azureuser"
Dönüş değerlerinin tür bilgileriyle çevrelenmesini önlemek için aşağıdaki sorguda gösterildiği gibi biçimlendirmeyi kullanın tsv :
USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername" --output tsv)
echo $USER
azureuser
Tablo çıkış biçimi
table biçimi çıkışı bir ASCII tablosu olarak yazdırarak okunmasını ve taranmasını kolaylaştırır. Tabloya tüm alanlar dahil edilmediğinden, bu biçim en iyi şekilde verilere insan tarafından aranabilir bir genel bakış olarak kullanılır. Tabloya dahil edilmeyen alanlar sorgunun bir parçası olarak filtrelenebilir.
Not
Belirli anahtarlar filtrelenir ve tablo görünümünde yazdırılmaz. Bunlar id, type ve etag anahtarlarıdır. Bu değerleri görmek için çoklu seçim karmasında anahtar adını değiştirebilirsiniz.
az vm show --resource-group QueryDemo --name TestVM --query "{objectID:id}" --output table
Bunu göstermek için önceki bir sorguyu kullanabiliriz. Özgün sorgu, kaynak grubundaki her vm için ad, işletim sistemi ve yönetici adını içeren bir JSON nesnesi döndürdü:
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"
}
]
Çıkış biçimiyle --output table birleştirildiğinde, sütun adları çoklu seçim karmasının değeriyle displayKey eşleşerek bilgilerin kaymasını kolaylaştırır:
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
Sonraki adımlar
JMESPath sorguları hakkında daha fazla bilgi edinmek için bkz. JMESPath Öğreticisi.
Bu makalede bahsedilen diğer Azure CLI kavramları hakkında daha fazla bilgi edinmek için bkz: