Как получить значение ключа JSON в командная строка?

Это мой вывод JSON для этой команды aws logs list-log-groups , и из этого мне нужно, чтобы первое значение "arn" было выделено. Как я могу это сделать?

{
    "logGroups": [
        {
            "logGroupName": "alla",
            "creationTime": 1594638588652,
            "metricFilterCount": 0,
            "arn": "arn:aws:logs:us-east-1:12345678910:log-group:*:*",
            "storedBytes": 0
        },
        {
            "logGroupName": "mahi",
            "creationTime": 1594638580461,
            "metricFilterCount": 0,
            "arn": "arn:aws:logs:us-east-1:12345678910:log-group:*:*",
            "storedBytes": 0
        }
    ]
}
1
задан 16 July 2020 в 19:44

2 ответа

Недавно я обнаружил инструмент под названием gron .

gron <<'END_JSON'
{
    "logGroups": [
        {
            "logGroupName": "alla",
            "creationTime": 1594638588652,
            "metricFilterCount": 0,
            "arn": "arn:aws:logs:us-east-1:12345678910:log-group:*:*",
            "storedBytes": 0
        },
        {
            "logGroupName": "mahi",
            "creationTime": 1594638580461,
            "metricFilterCount": 0,
            "arn": "arn:aws:logs:us-east-1:12345678910:log-group:*:*",
            "storedBytes": 0
        }
    ]
}
END_JSON
json = {};
json.logGroups = [];
json.logGroups[0] = {};
json.logGroups[0].arn = "arn:aws:logs:us-east-1:12345678910:log-group:*:*";
json.logGroups[0].creationTime = 1594638588652;
json.logGroups[0].logGroupName = "alla";
json.logGroups[0].metricFilterCount = 0;
json.logGroups[0].storedBytes = 0;
json.logGroups[1] = {};
json.logGroups[1].arn = "arn:aws:logs:us-east-1:12345678910:log-group:*:*";
json.logGroups[1].creationTime = 1594638580461;
json.logGroups[1].logGroupName = "mahi";
json.logGroups[1].metricFilterCount = 0;
json.logGroups[1].storedBytes = 0;

Этот инструмент преобразует нотацию JSON в построчный javascript, который можно легко использовать.

$ arn=$(gron <<'END_JSON' | sed -En '/json\.logGroups\[0\]\.arn/ s/^[^"]*"(.*)";$/\1/p'
{
  ...
}
END_JSON
)
$ echo "$arn"
arn:aws:logs:us-east-1:12345678910:log-group:*:*
1
ответ дан 30 July 2020 в 22:06

Использовать jq :

aws logs list-log-groups | jq -r '.logGroups[0].arn'

Выход:

arn:aws:logs:us-east-1:929815623526:log-group:alla:

jq можно установить из репозитория юниверса :

sudo apt install jq

jq предпочтительнее для анализа json , но если jq не подходит по любой причине, и вы знаете, что формат не изменится, вы можете использовать grep -P и head -n1 :

aws logs list-log-groups | grep -Po '"arn": "\K[^"]*' | head -n1
2
ответ дан 30 July 2020 в 22:06

Другие вопросы по тегам:

Похожие вопросы: