Saya memiliki keluaran JSON yang darinya saya perlu mengekstrak beberapa parameter di Linux.
Ini adalah keluaran 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
}
]
}
Saya ingin menulis file yang berisi heading seperti instance id, tag like name, cost center, owner. dan di bawah nilai tertentu dari output JSON. Output yang diberikan di sini hanyalah sebuah contoh.
Bagaimana saya bisa melakukannya menggunakan sed
dan awk
?
Keluaran yang diharapkan :
Instance id Name cost centre Owner
i-1234576 RDS_Machine (us-east-1c) 1234 Jyoti
Jawaban yang Diterima:
Ketersediaan parser di hampir semua bahasa pemrograman merupakan salah satu keunggulan JSON sebagai format pertukaran data.
Daripada mencoba mengimplementasikan pengurai JSON, Anda mungkin lebih baik menggunakan alat yang dibuat untuk penguraian JSON seperti jq atau bahasa skrip tujuan umum yang memiliki pustaka JSON.
Misalnya, menggunakan jq, Anda dapat menarik ImageID dari item pertama larik Instances sebagai berikut:
jq '.Instances[0].ImageId' test.json
Atau, untuk mendapatkan informasi yang sama menggunakan perpustakaan JSON Ruby:
ruby -rjson -e 'j = JSON.parse(File.read("test.json")); puts j["Instances"][0]["ImageId"]'
Saya tidak akan menjawab semua pertanyaan dan komentar Anda yang telah direvisi, tetapi yang berikut ini mudah-mudahan cukup untuk membantu Anda memulai.
Misalkan Anda memiliki skrip Ruby yang dapat membaca a dari STDIN dan menampilkan baris kedua dalam contoh output[0] Anda. Skrip itu mungkin terlihat seperti:
#!/usr/bin/env ruby
require 'json'
data = JSON.parse(ARGF.read)
instance_id = data["Instances"][0]["InstanceId"]
name = data["Instances"][0]["Tags"].find {|t| t["Key"] == "Name" }["Value"]
owner = data["Instances"][0]["Tags"].find {|t| t["Key"] == "Owner" }["Value"]
cost_center = data["Instances"][0]["SubnetId"].split("-")[1][0..3]
puts "#{instance_id}t#{name}t#{cost_center}t#{owner}"
Bagaimana Anda bisa menggunakan skrip seperti itu untuk mencapai seluruh tujuan Anda? Nah, misalkan Anda sudah memiliki yang berikut ini:
- perintah untuk membuat daftar semua instance Anda
- perintah untuk mendapatkan json di atas untuk setiap instance di daftar Anda dan menampilkannya ke STDOU
Salah satu caranya adalah dengan menggunakan shell Anda untuk menggabungkan alat-alat ini:
echo -e "Instance idtNametcost centretOwner"
for instance in $(list-instances); do
get-json-for-instance $instance | ./ugly-ruby-scriptrb
done
Sekarang, mungkin Anda memiliki satu perintah yang memberi Anda satu json blob untuk semua instance dengan lebih banyak item dalam larik "Instances" itu. Nah, jika itu masalahnya, Anda hanya perlu sedikit memodifikasi skrip untuk beralih melalui array daripada hanya menggunakan item pertama.
Pada akhirnya, cara untuk menyelesaikan masalah ini, adalah cara untuk menyelesaikan banyak masalah di Unix. Memecahnya menjadi masalah yang lebih mudah. Temukan atau tulis alat untuk memecahkan masalah yang lebih mudah. Gabungkan alat tersebut dengan shell Anda atau fitur sistem operasi lainnya.
[0] Perhatikan bahwa saya tidak tahu dari mana Anda mendapatkan pusat biaya, jadi saya mengarangnya saja.