JMESPath sorgusu kullanarak Azure CLI komut çıktısını sorgulama

Azure CLI, komut sonuçları üzerinde bir 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.

Azure CLI'daki tüm komutlar parametresini --query destekler. 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 çıktısını seçmek ve değiştirmek için sorguları kullanır. Sorgular, herhangi bir görüntüleme biçimlendirmesi olmadan önce 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 Cloud Shell veya cmd'de sorgu çalıştırmanız önerilir. Sorgu örneklerinin bozulmadan doğru olduğundan emin olmak için kullandığınız kabuğun sekmesini seçin.

Sözlük ve liste CLI sonuçları

ÇıKTı biçimi JSON dışında bir şey olsa bile, CLI komut sonuçları ilk olarak sorgular için JSON olarak değerlendirilir. 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.

Bu bir dizi örneğidir:

[ 
  1,
  2,
  3
]

Bu bir sözlük örneğidir:

{
  "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ı inceleyin:

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ğlanma yetkisine sahip 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 dizeleri büyük/küçük harfe duyarlıdır. Örneğin, önceki sorguda 'osProfile' değerini '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ısını ve SSH anahtarını bir kerede 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 sonraki 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 , çıktıda gösterilen dizedir ve JMESPathExpression değerlendirilecek JMESPath ifadesidir. Çoklu seçim listesini karma olarak değiştirerek son bölümdeki örneği değiştirin:

Not

yerine VM nameVMNameyeni bir sütun adında boşluk kullanmayı seçerseniz, hem Bash hem de PowerShell'de alıntı yapma kuralları değişir. Örnekler için bkz . Azure CLI parametrelerinde alanları geçirme.

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.

Bir diziyi düzleştirme işlemi JMESPath işleciyle [] yapılır. İşleç sonrasındaki [] tüm ifadeler geçerli dizideki her öğeye uygulanır. Sorgunun başında görünürse [] , CLI komut sonucunu düzleştirmesini sağlar. 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 düzleştirilebilir, yalnızca komut tarafından döndürülen en üst düzey sonuç değil. Son bölümde ifade osProfile.linuxConfiguration.ssh.publicKeys[0].keyData , oturum açma için SSH ortak anahtarını almak için 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"
  ]
}

Dizileri boole ifadeleriyle 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, veya falseolarak değerlendirilebilecek true herhangi bir deyimdir (Boole özellikleri dahil). 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ırma ve mantıksal işleçler sunar. Bunlar , , <=, >, >=, ==ve !=içerir<. JMESPath ayrıca () 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şul ve mantıksal işlemlerin 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. Filtrelerin kullanılmasıyla 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 örnek, 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ğini gösterir.

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 dizilerde, verileri seçmeden önce filtreyi uygulamak daha hızlı olabilir.

Önemli

JMESPath'te dizeler her zaman tek tırnak () veya kaçış karakterleri (') ile çevrilir`. 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 sorgu oluşturmak için JMESPath işlevlerini kullanmaya odaklanırken , Çıktıyı işlevlerle işleme 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)bu kavram 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 .

Çıktıyı işlevlerle düzenleme

JMESPath işlevlerinin başka bir amacı da vardır. Bu da sorgunun sonuçları üzerinde çalışmaktır. Önyükleme 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 vm listesinin işletim sistemi disk boyutuna göre nasıl sıralanacağınız gösterilmektedir:

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 her zaman önce çıkışta JSON çalıştırılır ve sonra biçimlendirilir.

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

Çıkış tsv biçimi ek biçimlendirme, anahtar veya diğer simgeler olmadan sekme ve yeni satırla ayrılmış değerler döndürür. Bu biçim, çıktı bir parametrede depolandığında ve başka bir komutta 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 sorun olabilir. Komut çıkışı doğrudan ortam değişkenine atanmışsa, tırnak işaretleri kabuk tarafından yorumlanmayabilir. Bu sorun, 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. Tüm alanlar tabloya dahil edilmediğinden, bu biçim en iyi şekilde verilere insan tarafından aranabilir bir genel bakış olarak kullanılır. Tabloya dahil olmayan 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

Bu kavramı 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ı çok seçimli karma 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: