JMESPath 쿼리를 사용하여 Azure CLI 명령 출력을 쿼리하는 방법

Azure CLI는 --query 매개 변수를 사용하여 명령의 결과에 대해 JMESPath 쿼리를 실행합니다. JMESPath는 JSON에 대한 쿼리 언어로, CLI 출력에서 데이터를 선택하고 수정하는 기능을 제공합니다.

Azure CLI의 모든 명령은 매개 변수를 지원합니다 --query . 이 문서에서는 JMESPath의 기능을 사용하는 방법과 쿼리의 예제를 제공합니다. 개념 탭에서 쿼리하는 데 유용한 JMESPath 개념에 대해 알아봅니다. 예제 탭에서 JMESPath 쿼리의 예제를 참조하세요.

Azure CLI는 쿼리를 사용하여 Azure CLI 명령의 출력을 선택하고 수정합니다. 쿼리는 표시 서식 지정 전에 Azure CLI 명령의 반환된 JSON 개체에서 클라이언트 쪽에서 실행됩니다.

쿼리에 필요한 이스케이프 문자는 환경마다 다릅니다. 이러한 셸에는 더 적은 이스케이프 문자가 필요하기 때문에 Azure Cloud Shell 또는 cmd에서 쿼리를 실행하는 것이 좋습니다. 쿼리 예제가 구문적으로 올바른지 확인하려면 사용 중인 셸의 탭을 선택합니다.

사전 및 CLI 결과 나열

CLI 명령 결과는 출력 형식이 JSON 이외의 항목인 경우에도 쿼리에 대해 먼저 JSON으로 처리됩니다. CLI 결과는 JSON 배열 또는 사전입니다. 배열은 인덱싱할 수 있는 개체의 시퀀스이며 사전은 키로 액세스되는 순서가 지정되지 않은 개체입니다.

다음은 배열의 예입니다.

[ 
  1,
  2,
  3
]

다음은 사전의 예입니다.

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

둘 이상의 개체를 반환할 수 있는 명령은 배열을 반환하고, 항상 단일 개체만 반환하는 명령은 사전을 반환합니다.

사전에 속성 가져오기

사전 결과를 사용하여 키만 사용하여 최상위 수준의 속성에 액세스할 수 있습니다. . (하위 식) 문자는 중첩된 사전의 속성에 액세스하는 데 사용됩니다. 쿼리를 도입하기 전에 az vm show 명령의 수정되지 않은 출력을 살펴보세요.

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

이 명령은 사전을 출력합니다. 일부 콘텐츠는 생략되었습니다.

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

다음 명령은 쿼리를 추가하여 VM에 연결할 수 있는 SSH 공개 키를 가져옵니다.

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

쿼리 문자열은 대/소문자를 구분합니다. 예를 들어 이전 쿼리에서 'osProfile'을 'OsProfile'으로 변경해도 올바른 결과가 반환되지 않습니다.

여러 값 가져오기

둘 이상의 속성을 가져오려면 대괄호 [ ](다중 선택 목록)에 쉼표로 구분된 식을 입력하세요. 다음 명령은 VM 이름, 관리 사용자 및 SSH 키를 한 번에 가져옵니다.

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

이러한 값은 쿼리에서 제공된 순서로 결과 배열에 나열됩니다. 결과는 배열이므로 결과와 연결된 키가 없습니다. 배열 대신 사전을 얻으려면 다음 섹션을 참조하세요.

쿼리의 속성 이름 바꾸기

여러 값을 쿼리할 때 배열 대신 사전을 얻으려면 (다중 선택 해시) 연산자를 사용합니다 { } . 다중 선택 해시의 형식은 .입니다 {displayName:JMESPathExpression, ...}. displayName 는 출력에 표시된 문자열이며 JMESPathExpression 평가할 JMESPath 식입니다. 다중 선택 목록을 해시로 변경하여 마지막 섹션에서 예제를 수정합니다.

참고 항목

대신 새 열 이름 VM nameVMName에 공백을 사용하도록 선택하면 Bash와 PowerShell 모두에서 따옴표 규칙이 변경됩니다. 예제는 Azure CLI 매개 변수의 Pass spaces를 참조하세요.

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

배열의 속성 가져오기

배열에는 자체 속성이 없지만 인덱싱할 수 있습니다. 이 기능은 배열의 첫 번째 요소를 가져오는 식 publicKeys[0]과 함께 마지막 예제에 publicKeys 표시됩니다. CLI 출력이 정렬되었는지 보장할 수 없으므로 순서가 확실하지 않거나 어떤 요소를 얻을지 신경 쓰지 않는 한 인덱싱을 사용하지 마세요. 배열의 요소 속성에 액세스하려면 평면화 또는 필터링 중 하나를 수행합니다. 이 섹션에서는 배열을 평면화하는 방법을 설명합니다.

배열을 평면화는 [] JMESPath 연산자를 사용 하여 이루어집니다. [] 연산자 다음의 모든 표현식은 현재 배열의 각 요소에 적용됩니다. 쿼리 시작 부분에 []이 나타나면 CLI 명령 결과가 평면화됩니다. az vm list의 결과는 이 기능을 사용하여 검사할 수 있습니다. 다음 쿼리는 리소스 그룹의 각 VM에 대한 이름, OS 및 관리자 이름을 가져옵니다.

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

명령으로 반환된 최상위 결과뿐만 아니라 모든 배열을 평면화할 수 있습니다. 마지막 섹션에서 이 식 osProfile.linuxConfiguration.ssh.publicKeys[0].keyData 은 로그인에 대한 SSH 공개 키를 가져오는 데 사용되었습니다. 모든 SSH 공개 키를 가져오기 위해 식을 대신 .로 osProfile.linuxConfiguration.ssh.publicKeys[].keyData작성할 수 있습니다. 이 쿼리 식은 배열을 osProfile.linuxConfiguration.ssh.publicKeys 평면화한 다음 각 요소에서 keyData 식을 실행합니다.

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

부울 식을 사용하여 배열 필터링

배열에서 데이터를 가져오는 데 사용되는 다른 작업은 필터링입니다. 필터링은 JMESPath 연산자를 사용하여 [?...] 수행됩니다. 이 연산자는 조건자를 해당 내용으로 사용합니다. 조건자는 하나 또는 false로 평가할 true 수 있는 모든 문(부울 속성 포함)입니다. 조건자가 계산 true 되는 식은 출력에 포함됩니다.

첫 번째 쿼리는 속성이 true인 계정에 isDefault 연결된 모든 Azure 구독의 이름을 나열하는 방법을 보여 줍니다. 두 번째 및 세 번째 쿼리는 isDefault 속성이 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"

JMESPath는 표준 비교 및 논리 연산자를 제공합니다. 여기에는 <,, <=>, >===!=. JMESPath는 논리 및() 또는 (&&)가 아닌(||!)도 지원합니다. 괄호 안에 식은 그룹화하여 더 복잡한 조건자 식이 가능합니다. 조건자 및 논리 작업에 대한 자세한 내용은 JMESPath 사양참조하세요.

마지막 섹션에서는 리소스 그룹의 모든 VM의 전체 목록을 가져오기 위해 배열을 평면화했습니다. 필터를 사용하면 이 출력을 Linux VM으로만 제한할 수 있습니다.

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

OS 디스크 크기와 같은 숫자 값을 필터링할 수도 있습니다. 다음 예제에서는 디스크 크기가 50GB보다 크거나 같은 VM 목록을 표시하도록 VM 목록을 필터링하는 방법을 보여 줍니다.

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

대형 배열의 경우, 데이터를 선택하기 전에 필터를 적용하는 것이 더 빠를 수 있습니다.

Important

JMESPath에서 문자열은 항상 작은 따옴표(') 또는 이스케이프 문자(`)로 둘러싸여 있습니다. 필터 조건자에서 문자열의 일부로 큰따옴표를 사용하는 경우 빈 출력이 표시됩니다.

JMESPath 함수

JMESPath에는 더 복잡한 쿼리를 허용하고 쿼리 출력을 수정할 수 있는 기본 제공 함수도 있습니다. 이 섹션에서는 JMESPath 함수를 사용하여 쿼리를 만드는 데 중점을 두고 함수를 사용하여 출력 조작 섹션에서는 함수를 사용하여 출력을 수정하는 방법을 보여 줍니다.

표현식은 함수를 호출하기 전에 평가되므로 인수 자체가 JMESPath 표현식이 될 수 있습니다. 다음 예제에서는 문자열에 부분 문자열이 포함되어 있는지 확인하는 검사 사용하여 contains(string, substring)이 개념을 보여 줍니다. 이 명령은 해당 OS 디스크에 SSD 스토리지를 사용하는 모든 VM을 찾습니다.

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

Pipe 식

|가 명령줄에서 사용되는 방법과 마찬가지로 |는 중간 쿼리 결과에 식을 적용하기 위해 JMESPath 쿼리에서 사용할 수 있습니다. |를 사용하여 복잡한 쿼리를 더 간단한 하위 식으로 세분화할 수도 있습니다. 이전 섹션에서 쿼리를 줄이려면 데이터를 평면화하고 선택한 후 필터를 적용하는 데 |를 사용합니다.

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

전체 함수 목록은 JMESPath 사양 - 기본 제공 함수를 참조하세요.

함수를 사용하여 출력 조작

또한 JMESPath 함수에는 쿼리 결과에 대해 작동하는 또 다른 목적이 있습니다. 부울 값이 아닌 값을 반환하는 함수는 식의 결과를 변경합니다. 예를 들어 .을 사용하여 속성 값을 sort_by(array, &sort_expression)기준으로 데이터를 정렬할 수 있습니다. JMESPath는 함수의 일부로 나중에 평가해야 하는 식에 특수 연산 &자를 사용합니다. 다음 예제에서는 OS 디스크 크기에 따라 VM 목록을 정렬하는 방법을 보여 줍니다.

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

전체 함수 목록은 JMESPath 사양 - 기본 제공 함수를 참조하세요.

쿼리 결과 서식 지정

Azure CLI는 JSON을 기본 출력 형식으로 사용하지만 다른 출력 형식은 목적 및 결과에 따라 쿼리에 더 적합할 수 있습니다. 쿼리는 항상 먼저 출력에서 JSON 실행된 다음 형식이 지정됩니다.

이 섹션에서는 tsvtable 형식과 각 형식에 대한 몇 가지 사용 사례를 설명합니다. 출력 형식에 대한 자세한 내용은 Azure CLI 명령에 대한 출력 형식을 참조하세요.

TSV 출력 형식

출력 형식은 tsv 추가 서식, 키 또는 기타 기호 없이 탭 및 줄 바꿈으로 구분된 값을 반환합니다. 이 형식은 출력이 매개 변수에 저장되고 다른 명령에 사용될 때 유용합니다.

tsv 서식 지정의 한 가지 사용 사례는 Azure 리소스 ID 또는 리소스 이름과 같은 CLI 명령에서 값을 검색하고 해당 값을 로컬 환경 변수에 저장하는 쿼리입니다. 기본적으로 결과는 JSON 형식으로 반환되며 문자로 묶 " 인 JSON 문자열을 처리할 때 문제가 될 수 있습니다. 명령 출력이 환경 변수에 직접 할당된 경우 셸에서 따옴표를 해석하지 못할 수 있습니다. 이 문제는 다음 예제에서 환경 변수에 쿼리 결과를 할당하는 것을 볼 수 있습니다.

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

다음 쿼리에 설명된 대로 형식 지정을 사용하여 tsv 반환 값을 형식 정보로 묶지 않도록 합니다.

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

테이블 출력 형식

이 형식은 table 출력을 ASCII 테이블로 인쇄하므로 쉽게 읽고 스캔할 수 있습니다. 모든 필드가 테이블에 포함되는 것은 아니므로 이 형식은 사람이 검색할 수 있는 데이터 개요로 사용하는 것이 좋습니다. 테이블에 포함되지 않은 필드는 쿼리의 일부로 필터링할 수 있습니다.

참고 항목

특정 키는 필터링되고 테이블 뷰에 인쇄되지 않습니다. 이러한 키는 id, typeetag입니다. 이러한 값을 보려면 multiselect 해시 키 이름을 변경할 수 있습니다.

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

이전 쿼리를 사용하여 이 개념을 보여 줄 수 있습니다. 원래 쿼리는 리소스 그룹의 각 VM에 대한 이름, OS 및 관리자 이름을 포함하는 JSON 개체를 반환했습니다.

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

--output table 출력 양식과 결합하면 열 이름이 다중 선택 해시의 displayKey 값과 일치하여 정보를 더 쉽게 파악할 수 있습니다.

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

다음 단계

JMESPath 쿼리에 대한 자세한 내용은 JMESPath 자습서를 참조하세요.

이 문서에서 언급한 다른 Azure CLI 개념에 대한 자세한 내용은 다음을 참조하세요.