GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Mengurai Json Dengan Shell Scripting Di Linux?

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
Terkait:Linux – Unix/Linux:mencari file yang berisi string secara rekursif?

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.


Linux
  1. Bagaimana saya menggunakan Vagrant dengan libvirt

  2. Cara mengubah kata dalam file dengan skrip shell linux

  3. Bagaimana Linux menangani skrip shell?

  1. Cara mengenkripsi file dengan gocryptfs di Linux

  2. Cara Mengganti Shell di Linux

  3. Bagaimana saya bisa melakukan pembagian dengan variabel di shell Linux?

  1. Dasar-dasar Linux:Cara Mengunduh File di Shell Dengan Wget

  2. Bagaimana cara mengganti nama file dengan spasi menggunakan shell Linux?

  3. Bagaimana cara memeriksa kata sandi dengan Linux?