Эквивалент jq в python

cat * | jq '.cis[].properties.cloud_vm_display_name' | grep -v null

"азуXXXXX" "азуXXXXX" "азуХХХХХ" "азуХХХХХ"

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

a = data1['cis'][0]['properties']['TenantsUses'][0]
print(a)
b = data1['cis'][]['properties']['cloud_vm_display_name']
File "<stdin>", line 17
b = data1['cis'][]['properties']['cloud_vm_display_name']
                 ^
SyntaxError: invalid syntax

print(a) обеспечивает правильный вывод, но значение [] для переменной b неизвестно, нужна ваша поддержка в поиске вывода.

Чтобы найти имя виртуальной машины из различных файлов JSON, созданных для разных серверов.

Здесь нет никакого волшебного синтаксиса, вам нужна какая-то итерация по данным ['cis'], чтобы найти совпадение.

Sayse 15.03.2024 12:17

Для получения наилучшего ответа вы можете включить в вопрос небольшой файл JSON, который соответствует реальному файлу, а также предоставить ожидаемый результат.

Ted Lyngmo 15.03.2024 12:18

Итак, вы хотите игнорировать отображаемые имена виртуальных машин, такие как «аннулировано» или «аннулировано»? Но в Python есть циклы, поэтому используйте их.

knittl 18.03.2024 12:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В Python есть циклы (и понимание списков), которые можно здесь использовать.

b = []
for cis in data1['cis']:
  name = cis['properties']['cloud_vm_display_name']
  if not 'null' in name:
    b.append(name)
print(b)

С пониманием списка:

b = [cis['properties']['cloud_vm_display_name'] for cis in data1['cis'] if not 'null' in cis['properties']['cloud_vm_display_name']]

или выражение-генератор для подготовки данных и генератор списка для фильтрации нужных имен:

names = (cis['properties']['cloud_vm_display_name'] for cis in data1['cis'])
b = [name for name in names if not 'null' in name]

Обратите внимание, что это реализует то же поведение, что и ваш пример grep: любое имя, которое где-либо содержит значение null (например, «обнулено» или «аннулировано»), не будет частью результирующего списка. Вероятно, вы имели в виду grep -vx или name == 'null' соответственно. Еще лучше, вообще не используйте grep, а фильтруйте напрямую с помощью jq: .cis[].properties.cloud_vm_display_name | values.

Ответ принят как подходящий

Моим требованием было собрать сведения о файловой системе сервера Windows, развернутого в Azure. Инструмент CMDB собирал полную информацию обо всем сервере Windows, и получить нужную информацию через вызов API не удалось, поскольку количество свойств различалось для каждого сервера, поэтому я использовал приведенный ниже механизм для получения данных. Спасибо всем участникам за предложения, возможно, я не смог правильно описать свою проблему.

    cis[103].properties.mount_point --> for one server
    cis[333].properties.mount_point --> for another server
    cis[348].properties.mount_point

Мне удалось это сделать, используя следующий метод: -

for line in cidet:
 line_number += 1
 target_number = '"type" : "file_system"'
 if target_number in line:
      fir_num = line_number
      last_num = fir_num + 40
      lin1 = fir_num + 20
      lin2 = fir_num + 22
      lin3 = fir_num + 36
      mt_pt = open("/home/"+udcid+"","r").readlines()[lin1]
      mt_pt = mt_pt.strip('"mount_point" : "')
      mt_pt = mt_pt.strip('",\n')
      dk_sz = open("/home/"+udcid+"","r").readlines()[lin2]
      dk_sz = dk_sz.strip('"disk_size" : "')
      dk_sz = dk_sz.strip('",\n')
      fr_sp = open("/home/a"+udcid+"","r").readlines()[lin3]
      fr_sp = fr_sp.strip('"free_space" : "')

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