Ваш ввод выглядит как json - если это json, то вы должны использовать для него синтаксический анализатор json, например jq
, например, после исправления вашего входного файла примера, чтобы он был действительным json, просто добавив завершающий }
:
$ cat file
{
"FleetAttributes": {
"FleetId": "fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05",
"FleetArn": "arn:aws:gamelift:us-west-2:321110313936:fleet/fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05",
"FleetType": "ON_DEMAND",
"InstanceType": "c4.large",
"Description": "Development build of Project Genesis",
"Name": "ProjectGenesis-DevelopmentBuild",
"CreationTime": 1560297730.139,
"Status": "NEW",
"BuildId": "build-0f8b9c4f-56a3-48e3-af28-018383af8fd1",
"NewGameSessionProtectionPolicy": "FullProtection",
"OperatingSystem": "WINDOWS_2012",
"ResourceCreationLimitPolicy": {
"NewGameSessionsPerCreator": 4,
"PolicyPeriodInMinutes": 15
},
"MetricGroups": [
"default"
]
}
}
и завершение jq
в сценарии оболочки и сохранение его вывода в переменной, как вы просили:
$ cat tst.sh
#!/bin/bash
tag="$1"
file="$2"
var=$(jq --arg tag "$tag" -r '.FleetAttributes[$tag]' "$file")
printf '%s\n' "$var"
$ ./tst.sh FleetId file
fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05
$ ./tst.sh BuildId file
build-0f8b9c4f-56a3-48e3-af28-018383af8fd1
В противном случае, если ваш ввод не действительно JSON или вы не можетеустановите инструмент, подобный jq
, который понимает json, тогда awk будет вашей следующей лучшей ставкой:
$ cat tst.sh
#!/bin/bash
tag="$1"
file="$2"
var=$(awk -v tag="$tag" '$1=="\""tag"\":"{sub(/",?$/,""); sub(/.*"/,""); print}' "$file")
printf '%s\n' "$var"
$ ./tst.sh FleetId file
fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05
$ ./tst.sh BuildId file
build-0f8b9c4f-56a3-48e3-af28-018383af8fd1
, но для этого потребуются значительные изменения:
$ jq -r .FleetAttributes.ResourceCreationLimitPolicy file
{
"NewGameSessionsPerCreator": 4,
"PolicyPeriodInMinutes": 15
}
$ jq -r .FleetAttributes.MetricGroups file
[
"default"
]