У меня есть вывод JSON, из которого мне нужно извлечь несколько параметров в Linux.
Это вывод JSON:
{
"OwnerId": "121456789127",
"ReservationId": "r-48465168",
"Groups": [],
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": null,
"RootDeviceType": "ebs",
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": false,
"LaunchTime": "2014-03-19T09:16:56.000Z",
"PrivateIpAddress": "10.250.171.248",
"ProductCodes": [
{
"ProductCodeId": "aacglxeowvn5hy8sznltowyqe",
"ProductCodeType": "marketplace"
}
],
"VpcId": "vpc-86bab0e4",
"StateTransitionReason": null,
"InstanceId": "i-1234576",
"ImageId": "ami-b7f6c5de",
"PrivateDnsName": "ip-10-120-134-248.ec2.internal",
"KeyName": "Test_Virginia",
"SecurityGroups": [
{
"GroupName": "Test",
"GroupId": "sg-12345b"
}
],
"ClientToken": "VYeFw1395220615808",
"SubnetId": "subnet-12345314",
"InstanceType": "t1.micro",
"NetworkInterfaces": [
{
"Status": "in-use",
"SourceDestCheck": true,
"VpcId": "vpc-123456e4",
"Description": "Primary network interface",
"NetworkInterfaceId": "eni-3619f31d",
"PrivateIpAddresses": [
{
"Primary": true,
"PrivateIpAddress": "10.120.134.248"
}
],
"Attachment": {
"Status": "attached",
"DeviceIndex": 0,
"DeleteOnTermination": true,
"AttachmentId": "eni-attach-9210dee8",
"AttachTime": "2014-03-19T09:16:56.000Z"
},
"Groups": [
{
"GroupName": "Test",
"GroupId": "sg-123456cb"
}
],
"SubnetId": "subnet-31236514",
"OwnerId": "109030037527",
"PrivateIpAddress": "10.120.134.248"
}
],
"SourceDestCheck": true,
"Placement": {
"Tenancy": "default",
"GroupName": null,
"AvailabilityZone": "us-east-1c"
},
"Hypervisor": "xen",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": false,
"VolumeId": "vol-37ff097b",
"AttachTime": "2014-03-19T09:17:00.000Z"
}
}
],
"Architecture": "x86_64",
"KernelId": "aki-88aa75e1",
"RootDeviceName": "/dev/sda1",
"VirtualizationType": "paravirtual",
"Tags": [
{
"Value": "Server for testing RDS feature in us-east-1c AZ",
"Key": "Description"
},
{
"Value": "RDS_Machine (us-east-1c)",
"Key": "Name"
},
{
"Value": "1234",
"Key": "cost.centre",
},
{
"Value": "Jyoti Bhanot",
"Key": "Owner",
}
],
"AmiLaunchIndex": 0
}
]
}
Я хочу написать файл, который содержит заголовок, такой как идентификатор экземпляра, тег как имя, МВЗ, владелец. и ниже этого значения из вывода JSON. Вывод, приведенный здесь, является лишь примером.
Как я могу сделать это с помощью sed
и awk
?
Ожидаемый результат:
Instance id Name cost centre Owner
i-1234576 RDS_Machine (us-east-1c) 1234 Jyoti
text-processing
sed
awk
json
user3086014
источник
источник
Ответы:
Наличие синтаксических анализаторов практически на каждом языке программирования является одним из преимуществ JSON как формата обмена данными.
Вместо того, чтобы пытаться реализовать анализатор JSON, вам, скорее всего, лучше использовать инструмент, созданный для анализа JSON, такой как jq, или язык сценариев общего назначения с библиотекой JSON.
Например, используя jq, вы можете извлечь ImageID из первого элемента массива Instances следующим образом:
Кроме того, чтобы получить ту же информацию, используя библиотеку JSON в Ruby:
Я не буду отвечать на все ваши исправленные вопросы и комментарии, но надеюсь, что следующего достаточно, чтобы вы начали.
Предположим, что у вас есть скрипт на Ruby, который может читать из STDIN и выводить вторую строку в вашем примере вывода [0]. Этот скрипт может выглядеть примерно так:
Как вы могли бы использовать такой сценарий для достижения цели? Ну, предположим, у вас уже было следующее:
Одним из способов будет использование вашей оболочки для объединения этих инструментов:
Теперь, может быть, у вас есть одна команда, которая даст вам один json blob для всех экземпляров с большим количеством элементов в этом массиве «Экземпляры». Ну, если это так, вам просто нужно немного изменить скрипт, чтобы перебрать массив, а не просто использовать первый элемент.
В конце концов, способ решить эту проблему, это способ решить многие проблемы в Unix. Разбейте его на более легкие проблемы. Найдите или напишите инструменты, чтобы решить более легкую проблему. Объедините эти инструменты с вашей оболочкой или другими функциями операционной системы.
[0] Обратите внимание, что я понятия не имею, откуда вы берете центр затрат, поэтому я просто придумал.
источник
Вы можете использовать следующий скрипт Python для анализа этих данных. Предположим, у вас есть данные JSON из массивов в таких файлах, как
array1.json
,array2.json
и так далее.А затем просто запустите:
Я не видел стоимость в ваших данных, поэтому я не учел это.
Согласно обсуждению в комментариях, я обновил скрипт parse.py:
Вы можете попробовать выполнить следующую команду:
источник
import json from pprint import pprint jdata = open('example.json') data = json.load(jdata) print "InstanceId", " - ", "Name", " - ", "Owner" print data["Instances"][0]["InstanceId"], " - " ,data["Instances"][0]["Tags"][1]["Value"], " - " ,data["Instances"][0]["Tags"][2]["Value"] jdata.close()
если у вас есть все данные json из массивов в таких файлах, как array1.json, array2.json, ... и так далее, вы можете попробовать запустить его так:# for x in
ls * .json; do python parse.py $x; done
Следующий код JQ:
используется как:
будет выводить:
Несколько указателей, чтобы понять код:
from_entries
берет массив объектов наподобие{key:a, value:b}
и превращает его в объект с соответствующими парами ключ / значение ({a: b}
);Key
иValue
ключи вTags
массиве должны были быть преобразованы в нижний регистр;Более подробную информацию можно найти в руководстве и руководстве jq по адресу https://stedolan.github.io/jq/.
источник
(.Tags | map({Value, Key}) | from_entries) as $tags
, не переводя ключи в нижний регистр.Другие предоставили общие ответы на ваш вопрос, которые демонстрируют хорошие способы синтаксического анализа json, однако я, как и вы, искал способ извлечь идентификатор экземпляра aws, используя основной инструмент, такой как awk или sed, без зависимости от других пакетов. Для этого вы можете передать аргумент «--output = text» в вашу команду aws, которая даст вам строку, доступную для анализа awk. При этом вы можете просто получить идентификатор экземпляра, используя что-то вроде следующего ...
источник
Jshon доступен в нескольких дистрибутивах:
Плохое объяснение:
-e uu
извлечет объектuu
,-a
сделает массив пригодным для использования (не уверен, что я правильно сформулировал этот, но в любом случае…),-u
декодирую строку,-p
вернусь к предыдущему элементу (кажется, что-i N
N, являясь любым числом, имеет тот же эффект) ,В зависимости от вашего случая вывод может потребовать дополнительной обработки (как, например, ваш).
Jshon
хотя это не кажется устойчивым к JSON-ошибкам (ваши «теги» с запятыми перед закрывающей фигурной скобкой вызовут ошибку).Кто-то упомянул jsawk в другой ветке, но я его не проверял.
источник
Если это ограничено случаем использования AWS, представленным выше, вы должны использовать флаги --query и --output для своего вызова API CLI
http://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html
источник
Вот одно-строчное предложение:
Не идеально, но это сработало бы, если немного подправить.
Это в основном используется
pr
для печати каждого набора результатов в столбце. Каждый набор результатов возвращается путем подстановки процесса, который анализирует файл JSON и возвращает значения на основе ключа.Это работает аналогично тому, как описано в разделе : При заданном содержании значения ключа, как сгруппировать значения по ключу и отсортировать по значению?
источник
Взгляните на
jtc
инструмент Cli:он позволяет легко извлекать необходимую информацию из вашего json (при условии, что он находится
file.json
, кстати, ваш JSON должен быть исправлен, там есть пара дополнительных запятых):источник
jq "." recovery.js | head -n 20
переводит ваш файл jason в нечто вроде:
Теперь должна быть возможность проанализировать ваши данные с помощью любых стандартных инструментов.
источник