Как я могу преобразовать свой вывод на .json и сохраняет его как файл .json

Получить системную информацию

#!/bin/bash

readarray -t array <<< "$(df -h)"

var=$(echo "${array[1]}"| grep -aob '%' | grep -oE '[0-9]+')

echo "${array[3]:$var-3:4}

echo -e "Manufacturer:\t"`cat /sys/class/dmi/id/chassis_vendor`

echo -e "Product Name:\t"`cat /sys/class/dmi/id/product_name`

echo -e "Version:\t"`cat /sys/class/dmi/id/bios_version`

echo -e "Serial Number:\t"`cat /sys/class/dmi/id/product_serial`

echo -e "PC Name:\t"`hostname`

echo -e "Operating System:\t"`hostnamectl | grep "Operating System" | cut 
              -d ' ' -f5-`

echo -e "Architecture:\t"`arch`

echo -e "Processor Name:\t"`awk -F':' '/^model name/ {print $2}' 
              /proc/cpuinfo | uniq | sed -e 's/^[ \t]*//'`

echo -e "Memory:\t" `dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END 
                {print s / 1024 "GB"}'`

echo -e "HDD Model:\t" `cat /sys/block/sda/device/model`

echo -e "System Main IP:\t"`hostname -I`

Я хочу отобразить мой вывод, как это

    ({"Manufacturer":"Lenovo","Product Name":"Thinkpad":"Version":"T590","Serial Number":"1234567890" })
0
задан 24 March 2021 в 05:37

1 ответ

Это ваша реальная задача или очень упрощенная? Если реально, вы можете просто переписать этот скрипт с кавычками и фигурными брекетами, это не много работы. Упомяните пропущенное закрытие двойной цитаты в третьей строке кода.

#!/bin/bash
readarray -t array <<< "$(df -h)"

var=$(echo "${array[1]}"| grep -aob '%' | grep -oE '[0-9]+')

echo "${array[3]:$var-3:4}"

echo -e "({\"Manufacturer\":\""`cat /sys/class/dmi/id/chassis_vendor`"\","
echo -e "\"Product Name\":\""`cat /sys/class/dmi/id/product_name`"\","
echo -e "\"Version\":\""`cat /sys/class/dmi/id/bios_version`"\","
echo -e "\"Serial Number\":\""`cat /sys/class/dmi/id/product_serial`"\","
echo -e "\"PC Name\":\""`hostname`"\","
echo -e "\"Operating System\":\""`hostnamectl | grep "Operating System" | cut -d ' ' -f5-`"\","
echo -e "\"Architecture\":\""`arch`"\","
echo -e "\"Processor Name\":\""`awk -F':' '/^model name/ {print $2}' /proc/cpuinfo | uniq | sed -e 's/^[ \t]*//'`"\","
echo -e "\"Memory\":\"" `dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024 "GB"}'`"\","
echo -e "\"HDD Model\":\""`cat /sys/block/sda/device/model`"\","
echo -e "\"System Main IP\":\""`hostname -I`"\"})"

Для перенаправления этого вывода вы можете использовать несколько подходов. Сначала - вы можете просто использовать перенаправление при вызове скрипта, как

script.sh > result.json. 

вторым (если вы хотите всегда использовать одно и то же имя файла) - вы можете добавить следующую строку в начало сценария:

exec > filename.json

Третий путь - окружить Ваш желаемый выход с фигурными брелками и перенаправить эту часть:

#!/bin/bash
readarray -t array <<< "$(df -h)"

var=$(echo "${array[1]}"| grep -aob '%' | grep -oE '[0-9]+')

echo "${array[3]:$var-3:4}"

{echo -e "({\"Manufacturer\":\""`cat /sys/class/dmi/id/chassis_vendor`"\","
echo -e "\"Product Name\":\""`cat /sys/class/dmi/id/product_name`"\","
echo -e "\"Version\":\""`cat /sys/class/dmi/id/bios_version`"\","
echo -e "\"Serial Number\":\""`cat /sys/class/dmi/id/product_serial`"\","
echo -e "\"PC Name\":\""`hostname`"\","
echo -e "\"Operating System\":\""`hostnamectl | grep "Operating System" | cut -d ' ' -f5-`"\","
echo -e "\"Architecture\":\""`arch`"\","
echo -e "\"Processor Name\":\""`awk -F':' '/^model name/ {print $2}' /proc/cpuinfo | uniq | sed -e 's/^[ \t]*//'`"\","
echo -e "\"Memory\":\"" `dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024 "GB"}'`"\","
echo -e "\"HDD Model\":\""`cat /sys/block/sda/device/model`"\","
echo -e "\"System Main IP\":\""`hostname -I`"\"})"} > filename.json

Последний способ, которым я хотел бы предложить, - это модифицировать вывод вашего сценария после выполнения. Следующая команда будет иметь именно то, что вам нужно (но первая строка будет обработана таким же образом, и к нему будет добавлена ​​пустая строка, чтобы избежать его вы можете попробовать третий способ перенаправления вывода):

echo $(sed '$ s/,/)}/' <<< $(awk -F ":" 'BEGIN {OFS=""; print "({";}  { print "\"",$1,"\":\"",$2,"\",";} ' filename.json) | tr '\n' ' ') > filename.json

SED здесь используется для Добавьте котировки в каждое поле (-F Флаг означает «полевой сепаратор»), OFSS установлен в пустой строке, чтобы избежать дополнительных пробелов. Затем SED удаляет последнюю запятую (я знаю, что это возможно с awk, но этот подход выглядит намного проще, ИМО). TR используется для замены всех новеньких символов с пробелами. Выход перенаправляется в тот же файл. Echo в начале добавляет новую строку до конца вывода.

0
ответ дан 1 April 2021 в 23:00

Другие вопросы по тегам:

Похожие вопросы: