숫자 키를 사용하여 JQ를 사용하여 JSON을 구문 분석합니다.

숫자 키를 사용하여 JQ를 사용하여 JSON을 구문 분석합니다.

2000올바른 값을 반환하는 jq 명령의 값을 전달하는 컬이 아래에 있습니다.

curl -X GET \
  -H 'vmware-api-session-id: <auth-id>' \
  -k -s
  'https://<url>/api/vcenter/vm/vm-22' | python -m json.tool | jq -r '.disks."2000" | .label, .capacity' | paste - -

Hard disk 1 52143587328

2000이제 변수의 이 부분이 생겼습니다 . 좋아요 i=2000 와 jq 좋아요

jq -r '.disks."$i" 

반품

null null

2000변수를 통해 전달하는 방법을 알 수 없습니다.

답변1

jq -r --arg i "$i" '.disks[$i] | [ .label, .capacity ] | @tsv'

그러면 아래와 같이 쉘 변수가 표현식 i에 전달됩니다.jqjq바꾸다 $i(이것은 문자열입니다). 열쇠로 사용할 수 있습니다 [$i].

paste@tsv또한 원하는 두 값을 포함하는 배열을 사용함으로써 사용할 필요성도 없애줍니다 jq. 그러면 명령과 마찬가지로 탭으로 구분된 출력이 생성됩니다 paste.

데이터를 전달할 필요도 없습니다 python -m json.tool(이점이 무엇인지 모르겠습니다). 예쁜 인쇄용으로 사용하는 경우에는 jq.


보고 있다VMware API 문서, 특정 디스크에 대한 정보를 가져오기 위한 요청은 다음과 같습니다.

https://{api_host}/api/vcenter/vm/{vm}/hardware/disk/{disk}

vm-22이로 인해 및/또는 대신 은 VM의 이름이고 디스크 식별자를 사용해야 한다고 생각합니다 .{vm}2000"$i"{disk}vm-222000

이것은 당신에게 다음과 같은 것을 줄 것입니다

{
    "backing": {
        "type": "enum",
        "vmdk_file": "string"
    },
    "capacity": 0,
    "ide": {
        "master": false,
        "primary": false
    },
    "label": "string",
    "sata": {
        "bus": 0,
        "unit": 0
    },
    "scsi": {
        "bus": 0,
        "unit": 0
    },
    "type": "enum"
}

답으로.

다음을 사용하여 라벨과 용량을 탭으로 구분된 목록으로 구문 분석할 수 있습니다.

jq -r '[ .label, .capacity ] | @tsv'

관련 정보