簡體   English   中英

在Shell腳本中使用動態變量生成JSON

[英]Generate JSON using Dynamic Variable in Shell script

我需要從我的shell腳本生成JSON輸出。 我需要獲取特定機器的Ram插槽詳細信息並使用這些詳細信息生成JSON。 要獲取Ram詳細信息,我使用的是system_profiler SPMemoryDataType它生成如下詳細信息。

    BANK 0/DIMM0:

      Size: 2 GB
      Type: DDR3
      Speed: 1600 MHz
      Status: OK
      Manufacturer: 0x802C
      Part Number: 0x384A54463235363634485A2D3147364D3120
      Serial Number: 0xE98388E6

    BANK 1/DIMM0:

      Size: 2 GB
      Type: DDR3
      Speed: 1600 MHz
      Status: OK
      Manufacturer: 0x802C
      Part Number: 0x384A54463235363634485A2D3147364D3120
      Serial Number: 0xE98388E5

從那以后我應該像這樣形成JSON

[
{"Bank":"0/DIMM0","Serial Number":"0xE98388E6","Status":"OK"},
{"Bank":"1/DIMM0","Serial Number":"0xE98388E5","Status":"OK"}
]

要提取單獨的詳細信息,如銀行,序列號,狀態我們可以使用

system_profiler SPMemoryDataType | awk '/Bank/
system_profiler SPMemoryDataType | awk '/Serial/
system_profiler SPMemoryDataType | awk '/Status/

我確信需要使用Dynamic變量從結果中執行表單json。 但由於我是shell腳本的新手,我很困惑。 有沒有辦法從輸出生成JSON?

#!/usr/bin/awk -f

$1 == "BANK" {
    bank = $2
    sub(/:/, "", bank)
    while (getline > 0) {
        if ($1 == "Serial" && $2 == "Number:") {
            serial_number = $3
        } else if ($1 == "Status:") {
            status = $2
        }
        if (serial_number != "" && status != "") {
            entries[++e] = "{\"Bank\":\"" bank "\",\"Serial Number\":\"" serial_number "\",\"Status\":\"" status "\"}"
            break
        }
    }
    bank = serial_number = status = ""
}

END {
    print "["
    if (e > 0) {
        printf "%s", entries[1]
        for (i = 2; i <= e; ++i) {
            printf ",\n%s", entries[i]
        }
        print ""
    }
    print "]"
}

用法:

awk -f script.awk file
system_profiler SPMemoryDataType | awk -f script.awk

示例輸出:

[
{"Bank":"0/DIMM0","Serial Number":"0xE98388E6","Status":"OK"},
{"Bank":"1/DIMM0","Serial Number":"0xE98388E5","Status":"OK"}
]

在shell腳本中使用:

#!/bin/bash

system_profiler SPMemoryDataType | awk '$1 == "BANK" {
    bank = $2
    sub(/:/, "", bank)
    while (getline > 0) {
        if ($1 == "Serial" && $2 == "Number:") {
            serial_number = $3
        } else if ($1 == "Status:") {
            status = $2
        }
        if (serial_number != "" && status != "") {
            entries[++e] = "{\"Bank\":\"" bank "\",\"Serial Number\":\"" serial_number "\",\"Status\":\"" status "\"}"
            break
        }
    }
    bank = serial_number = status = ""
}

END {
    print "["
    if (e > 0) {
        printf "%s", entries[1]
        for (i = 2; i <= e; ++i) {
            printf ",\n%s", entries[i]
        }
        print ""
    }
    print "]"
}'

單行:

system_profiler SPMemoryDataType | awk '$1=="BANK"{bank=$2;sub(/:/,"",bank);while(getline>0){if($1=="Serial"&&$2=="Number:"){serial_number=$3}else if($1=="Status:"){status=$2};if(serial_number!=""&&status!=""){entries[++e]="{\"Bank\":\""bank"\",\"SerialNumber\":\""serial_number"\",\"Status\":\""status"\"}";break}};bank=serial_number=status=""}END{print "[";if(e>0){printf "%s",entries[1];for(i=2;i<=e;++i){printf ",\n%s",entries[i]};print""};print "]"}'

有一些庫可以這樣做..一個這樣的事情是https://github.com/jeganathgt/libjson-sh 它是獨立的shell腳本庫,提供簡單方便的API來在控制台中生成json輸出。

例如:

json_init
json_add_string "serial"  "$<cmd>"
json_add_string "bankinfo"   "$<cmd>"
json_add_string "status" "$<cmd>"
json_dump

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM