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, созданных для разных серверов.
Для получения наилучшего ответа вы можете включить в вопрос небольшой файл JSON, который соответствует реальному файлу, а также предоставить ожидаемый результат.
Итак, вы хотите игнорировать отображаемые имена виртуальных машин, такие как «аннулировано» или «аннулировано»? Но в Python есть циклы, поэтому используйте их.






В 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" : "')
Здесь нет никакого волшебного синтаксиса, вам нужна какая-то итерация по данным
['cis'], чтобы найти совпадение.