Как я могу найти пустое имя с помощью grep в bash json?

#json #bash #parsing #grep

Вопрос:

Как я могу найти пустое имя с помощью grep?

мои файлы json

 {
    "IDS": [
        {
            "digest": "sha256:b97"
        },
        {
            "digest": "sha256:d25"
        },
        {
            "digest": "sha256:c40",
            "tag": "0"
        }
    ]
}
 

Я хотел бы использовать grep для поиска файла дайджеста без тега.

я хочу, чтобы мне понравился этот результат.

 sha256:b97
sha256:d25
 

Я использовал «имеет(тег) == false» в jq, но моя природа окружающей среды недоступна с помощью jq

Интересно, как его использовать без jq, python и других инструментов.

Спасибо, что прочитали мой пост. XD

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

1. Если вы не используете/не пишете полноценный движок JSON в Bash, вам понадобятся некоторые предположения о том, как записывается файл JSON. Вы на 100% уверены, что файл соответствует точной структуре, как показано выше? Под структурой я имею в виду даже такие вещи, как расположение новых строк и запятых.

2. @vdavid да конечно! 100%, эта структура показана выше. Эта структура представляет собой команду aws ecr list-images.

Ответ №1:

Если о jq не может быть и речи, альтернативой awk может быть:

 awk '/"digest"[^,] $/{gsub(/"/,""); print $NF}' input.json
 

Если входные данные уменьшены:

 $ echo $foo
{ "IDS": [ { "digest": "sha256:b97" }, { "digest": "sha256:d25" }, { "digest": "sha256:c40", "tag": "0" } ] }
$
$ awk -vRS='[{}]' 'NF==2 amp;amp; $0 ~ /"digest"/{gsub(/"/,"");print $NF}' <<< "$foo"
sha256:b97
sha256:d25
 

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

1. Правильно, awk-хорошая альтернатива, но команда, похоже, не работает.

2. Тогда, возможно, вы не используете ввод, указанный в вопросе?

3. Нет, я использую этот ввод. json=$(эхо { «ИДЕНТИФИКАТОРЫ»: [ … ] })

4. Это сработает, если вы сохраните ввод как «input.json» и запустите его, как показано выше.

5. греаааааааааттттттттееееее! супер хак XD, спасибо тебе @Thomas Hansen

Ответ №2:

Не используйте для этого регулярное выражение. Используйте синтаксический анализатор JSON:

 jq -r '.IDS[] | select(has("tag") | not) | .digest' file.json
 

Если вам не разрешено использовать правильные инструменты, ваш работодатель не позволит вам выполнять вашу работу.

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

1. Я согласен, как вы можете видеть из текста, я раньше использовал jq.