Цикл на массиве JSON в скрипте bash и извлекает данные через JQ

#arrays #json #bash #jq

#массивы #json #bash #jq

Вопрос:

я хочу извлекать данные из файла jSON через jq в скрипте bash. У меня более 50 объектов SG в JSON.

вот пример одного SG . Я хочу напечатать идентификатор VPC и идентификатор группы в одной строке и так далее для других объектов.

Решение, которое я пробовал :

 jq -c . $old |
while IFS= read -r obj; do 
    vpcidold=$( printf '%s' "$obj" | jq '.SecurityGroups[].VpcId')
    securityidold=$( printf '%s' "$obj" | jq '.SecurityGroups[].GroupId')
    echo "${vpcidold}||${securityidold}"
done > oldtest.json
  

это рабочий файл, но он предоставляет данные построчно, и я хочу сделать это более оптимизированным с помощью цикла for.

Как я могу создать цикл для массива JSON, чтобы получить желаемый результат

     "SG": [
      {
        "Description": "des",
        "GroupName": "Gpname",
        "IpPermissions": [
          {
            "FromPort": 80,
            "IpProtocol": "tcp",
            "IpRanges": [
              {
                "CidrIp": "0.0.0.0/0"
              }
            ],
            "Ipv6Ranges": [],
            "PrefixListIds": [],
            "ToPort": 80,
            "UserIdGroupPairs": []
          }
        ],
        "OwnerId": "123",
        "GroupId": "sg",
        "IpPermissionsEgress": [
          {
            "IpProtocol": "-1",
            "IpRanges": [
              {
                "CidrIp": "0.0.0.0/0"
              }
            ],
            "Ipv6Ranges": [],
            "PrefixListIds": [],
            "UserIdGroupPairs": []
          }
        ],
        "Tags": [
          {
            "Key": "projectcode",
            "Value": "none"
          },
          {
            "Key": "sgid",
            "Value": "sg-123"
          }
        ],
        "VpcId": "vpc-123"
      }
    ]
  }, 
  

Комментарии:

1. Я в замешательстве: что такое ввод, что такое вывод?

2. Я хочу извлечь значение VPCid и групповой IP из файла json.

3. @choroba- если вы видите в моем файле JSON, вы можете увидеть, что там есть groupId и задан идентификатор группы, я хочу распечатать эти значения. Это только один объект, который вы можете видеть, похожий на то, что у меня есть 50 с лишним объектов, поэтому, я полагаю, мы должны использовать его для цикла

4. Можете ли вы включить хотя бы два экземпляра в образец? Что-то вроде jq '.SG[] | (.VpcId "||" .GroupId)' может работать в зависимости от того, как организованы объекты.

5. Я обновил файл json с 2 объектами SGS.

Ответ №1:

Если файл JSON представляет собой просто массив объектов, вам не нужно перебирать их в bash. jq будет неявно перебирать их:

 jq -r '.[][][] | (.VpcId   "||"   .GroupId)' file.json
  

Проверено на следующих входных данных:

 [
    { "SG": [
        {
            "Description": "des",
            "GroupName": "Gpname",
            "GroupId": "sg",
            "VpcId": "vpc-123"
        }
    ] },
    { "SG": [
        {
            "Description": "des",
            "GroupName": "xyz",
            "GroupId": "sg-12345",
            "VpcId": "vpc-12345"
        }
    ] }
]
  

Вывод:

 vpc-123||sg
vpc-12345||sg-12345
  

Комментарии:

1. Рассмотрите возможность фильтрации любого потомка с помощью groupId: jq -r '..|select(.GroupId?)|(.VpcId "||" .GroupId)'