2013-09-24 2 views
0

Мне нужно сгенерировать вывод JSON из моего сценария оболочки. Мне нужно получить информацию о слотах на данном конкретном компьютере и сгенерировать JSON, используя эти детали. Чтобы получить информацию о Ram, я использую system_profiler SPMemoryDataType Он производит детали следующим образом.Создание JSON с использованием динамической переменной в скрипте оболочки

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/ 

Я уверен, что есть необходимо, чтобы динамическая переменная делала форму json из результатов. Но поскольку я новичок в сценарии оболочки, я смущен. Есть ли способ генерировать JSON из вывода?

ответ

2
#!/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"} 
] 

Использование в сценарии оболочки:

#!/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 "]"}' 
+0

Большое спасибо за ваш ответ. Я работаю на удаленной машине Mac из системы Windows. Я использую plink для запуска сценария оболочки, который находится на локальной машине, я имею в виду Windows. Поэтому, если я использую скрипт, предоставленный вами, мне нужно скопировать файл script.awk на удаленную машину, что может замедлить процесс. Так что есть ли возможность иметь этот скрипт с единственным синглом #!/bin/bash файл? – BinaryMee

+0

@CMb Да, вы можете встроить его в сценарий оболочки. См. Обновление. – konsolebox

+0

Эй, человек. Это работало потрясающе. Большое спасибо. :) – BinaryMee

Смежные вопросы