JSON, анализирующий на оболочке

Просто снизьте интерфейс. Например, с eth0:

ip link set eth0 down

Возвращать интерфейс:

ip link set eth0 up
9
07.10.2014, 23:54
2 ответа

Как я понимаю, вы ищете значение "Фу". Это действительно легко сделать с помощью инструмента командной строки оболочки jq. Это что-то вроде sed в том, что он реализует свой собственный тип парсерного языка. В данном примере:

json='
{
    "Reservations" :
     {  
            "OwnerId" : "1345345",
            "Groups" :  [],
            "SecurityGroups" : [
               {
                  "Foo" : "yes",
                  "Bar" : "no"
               }
             ]
     }
}'

jq может получить yes так же просто, как:

printf %s "$json" |
jq '.[].SecurityGroups[0].Foo?'                                                

OUTPUT

"yes"

Вы можете пройтись по хэшу объекта или списку словарных статей, используя нотацию .dot, а индексированные массивы можно проиндексировать проще, с помощью, как Вы, вероятно, догадались, числовых индексов, заключённых в квадратные скобки. В команде выше я использую форму пустого индекса, чтобы показать, что я хочу, чтобы все элементы этого уровня были развернуты. Это может быть проще понять следующим образом:

printf %s "$json" | jq '.[][]'

... который разбивает все значения для элементов второго уровня в хэше и достает меня...

"1345345"
[]
[
  {
    "Foo": "yes",
    "Bar": "no"
  }
]

Это едва царапает поверхность относительно возможностей jq. Это чрезвычайно мощный инструмент для сериализации данных в оболочке, он компилируется в один исполняемый двоичный файл в классическом Unix-стиле, он, скорее всего, доступен через менеджер пакетов для вашего дистрибутива, и он очень хорошо документирован. Пожалуйста, посетите его git-страницу и убедитесь сами.

Кстати, другим способом решения проблемы многоуровневых данных в json - по крайней мере, чтобы получить представление о том, с чем вы работаете - может быть пойти другим путем и использовать . dot примечание, чтобы пробить все значения на всех уровнях типа:

printf %s "$json" | jq '..'

{
  "Reservations": {
    "OwnerId": "1345345",
    "Groups": [],
    "SecurityGroups": [
      {
        "Foo": "yes",
        "Bar": "no"
      }
    ]
  }
}
{
  "OwnerId": "1345345",
  "Groups": [],
  "SecurityGroups": [
    {
      "Foo": "yes",
      "Bar": "no"
    }
  ]
}
"1345345"
[]
[
  {
    "Foo": "yes",
    "Bar": "no"
  }
]
{
  "Foo": "yes",
  "Bar": "no"
}
"yes"
"no"

Но гораздо лучше, вероятно, было бы просто использовать один из множества методов обнаружения или поиска, которые jq предлагает для различных типов узлов.

8
27.01.2020, 20:05

Это ответ на вашу цель, но не ваш вопрос. Это означает, что вы можете выполнить вашу цель без использования парсера JSON.

AWS CLI UTIL имеет возможность только выбирать поля выбора, используя аргумент - запрос . Это задокументировано здесь .

Например:

$ aws ec2 describe-instances \
  --query 'Reservations[0].Instances[0].SecurityGroups[0].GroupName' \
  --instance-id i-6b272337 \
  --output text
mongodb

Вы можете даже выбрать несколько полей, если вы хотите:

$ aws ec2 describe-instances \
  --query 'Reservations[0].Instances[0].SecurityGroups[0].[GroupName,GroupId]' \
  --instance-id i-6b272337 \
  --output text
mongodb sg-710ffa14

, и вы также можете показать несколько сопоставленных структур:

$ aws ec2 describe-instances \
  --query 'Reservations[0].Instances[0].SecurityGroups[*].[GroupName,GroupId]' \
  --instance-id i-6b272337 \
  --output text
mongodb sg-710ffa14
default sg-a0243bcc
10
27.01.2020, 20:05

Теги

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