Saya memiliki output JSON dari mana saya perlu mengekstrak beberapa parameter di Linux.
Ini adalah output 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 tajuk seperti id instan, tag seperti nama, pusat biaya, pemilik. dan di bawah itu nilai-nilai tertentu dari output JSON. Output yang diberikan di sini hanyalah sebuah contoh.
Bagaimana saya bisa melakukan itu menggunakan sed
dan awk
?
Output yang diharapkan:
Instance id Name cost centre Owner
i-1234576 RDS_Machine (us-east-1c) 1234 Jyoti
text-processing
sed
awk
json
pengguna3086014
sumber
sumber
Jawaban:
Ketersediaan parser di hampir setiap bahasa pemrograman adalah salah satu keunggulan JSON sebagai format pertukaran-data.
Daripada mencoba mengimplementasikan parser JSON, Anda mungkin lebih baik menggunakan alat yang dibuat untuk parsing JSON seperti jq atau bahasa skrip tujuan umum yang memiliki pustaka JSON.
Misalnya, menggunakan jq, Anda bisa mengeluarkan ImageID dari item pertama array Instances sebagai berikut:
Atau, untuk mendapatkan informasi yang sama menggunakan perpustakaan JSON Ruby:
Saya tidak akan menjawab semua pertanyaan dan komentar Anda yang telah direvisi, tetapi yang berikut cukup mudah untuk membantu Anda memulai.
Misalkan Anda memiliki skrip Ruby yang dapat membaca dari STDIN dan menampilkan baris kedua dalam contoh keluaran Anda [0]. Skrip itu mungkin terlihat seperti:
Bagaimana Anda bisa menggunakan naskah seperti itu untuk mencapai seluruh tujuan Anda? Nah, misalkan Anda sudah memiliki yang berikut ini:
Salah satu caranya adalah dengan menggunakan shell Anda untuk menggabungkan alat-alat ini:
Sekarang, mungkin Anda memiliki perintah tunggal yang memberi Anda satu json blob untuk semua instance dengan item lebih banyak dalam array "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. Hancurkan menjadi masalah yang lebih mudah. Temukan atau tulis alat untuk menyelesaikan masalah yang lebih mudah. Gabungkan alat-alat itu dengan shell Anda atau fitur sistem operasi lain.
[0] Perhatikan bahwa saya tidak tahu dari mana Anda mendapatkan pusat biaya, jadi saya hanya mengada-ada.
sumber
Anda bisa menggunakan skrip python berikut untuk mengurai data itu. Mari kita asumsikan bahwa Anda memiliki data JSON dari array dalam file seperti
array1.json
,array2.json
dan seterusnya.Dan kemudian jalankan:
Saya belum melihat biaya dalam data Anda, itu sebabnya saya tidak memasukkannya.
Menurut diskusi dalam komentar, saya telah memperbarui skrip parse.py:
Anda dapat mencoba menjalankan perintah berikut:
sumber
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()
Jika Anda memiliki semua data json dari array dalam file seperti array1.json, array2.json, ... dan seterusnya, Anda dapat mencoba menjalankannya seperti ini:# for x in
ls * .json; do python parse.py $x; done
Kode jq berikut:
digunakan seperti:
akan menghasilkan:
Beberapa petunjuk untuk memahami kode:
from_entries
mengambil larik objek seperti{key:a, value:b}
dan mengubahnya menjadi objek dengan pasangan kunci / nilai yang sesuai ({a: b}
);Key
danValue
kunci dalamTags
array yang harus dikonversi ke huruf kecil;Untuk detail lebih lanjut, lihat tutorial dan manual jq di https://stedolan.github.io/jq/
sumber
(.Tags | map({Value, Key}) | from_entries) as $tags
, tanpa mengubah kunci menjadi huruf kecil.Orang lain telah memberikan jawaban umum untuk pertanyaan Anda yang menunjukkan cara-cara yang baik untuk mem-parsing json namun saya, seperti Anda, sedang mencari cara untuk mengekstrak id contoh aws menggunakan alat inti seperti awk atau sed tanpa tergantung pada paket lain. Untuk mencapai ini, Anda bisa meneruskan argumen "--output = text" ke perintah aws Anda yang akan memberi Anda string yang dapat diuraikan awk. Dengan itu Anda bisa mendapatkan ID instan menggunakan sesuatu seperti yang berikut ...
sumber
Jshon tersedia dalam beberapa distribusi:
Penjelasan yang buruk:
-e uu
akan mengekstrak objekuu
,-a
akan membuat array dapat digunakan (tidak yakin saya dengan benar mengutarakan yang satu ini tetapi toh ...),-u
akan mendekodekan string,-p
akan kembali ke item sebelumnya (sepertinya-i N
, N menjadi nomor berapa pun, memiliki efek yang sama) .Tergantung pada kasus Anda, hasilnya mungkin memerlukan beberapa pasca perawatan (seperti milik Anda, seperti yang Anda lihat).
Jshon
sepertinya tidak kuat terhadap malformasi JSON, ("Tag" Anda dengan koma sebelum braket keriting penutup akan menimbulkan kesalahan).Seseorang menyebutkan jsawk di utas lain, tapi saya belum mengujinya.
sumber
Jika ini terbatas pada case use AWS yang disediakan di atas, Anda harus menggunakan flag --query dan --output untuk panggilan API CLI Anda
http://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html
sumber
Berikut ini saran satu baris:
Tidak sempurna, tetapi itu akan berhasil jika Anda mengubah sedikit.
Ini pada dasarnya menggunakan
pr
untuk mencetak setiap hasil yang ditetapkan per kolom. Setiap set hasil dikembalikan oleh proses substitusi yang mem-parsing file JSON dan mengembalikan nilai berdasarkan kunci.Ini bekerja sama seperti yang dijelaskan dalam: Konten nilai kunci yang diberikan, bagaimana cara saya mengelompokkan nilai berdasarkan kunci dan mengurutkan berdasarkan nilai?
sumber
Lihatlah
jtc
cli tool:itu memungkinkan dengan mudah mengekstraksi informasi yang diperlukan dari json Anda (dengan asumsi itu ada
file.json
, btw, JSON Anda perlu diperbaiki, ada beberapa koma tambahan di sana):sumber
jq "." recovery.js | head -n 20
menerjemahkan file jason Anda ke sesuatu yang dapat digunakan kembali seperti ini:
Sekarang mungkin untuk mem-parsing data Anda dengan alat standar apa pun
sumber