Подтвердить что ты не робот

Выходной сигнал JSON от Bash script

Итак, у меня есть bash script, который выводит сведения о серверах. Проблема в том, что мне нужен вывод JSON. Каков наилучший способ сделать это? Вот bash script:

# Get hostname
hostname=`hostname -A` 2> /dev/null

# Get distro
distro=`python -c 'import platform ; print platform.linux_distribution()[0] + " " +        platform.linux_distribution()[1]'` 2> /dev/null

# Get uptime
if [ -f "/proc/uptime" ]; then
uptime=`cat /proc/uptime`
uptime=${uptime%%.*}
seconds=$(( uptime%60 ))
minutes=$(( uptime/60%60 ))
hours=$(( uptime/60/60%24 ))
days=$(( uptime/60/60/24 ))
uptime="$days days, $hours hours, $minutes minutes, $seconds seconds"
else
uptime=""
fi

echo $hostname
echo $distro
echo $uptime

Таким образом, я хочу получить что-то вроде:

{"hostname":"server.domain.com", "distro":"CentOS 6.3", "uptime":"5 days, 22 hours, 1 minutes, 41 seconds"}

Спасибо.

4b9b3361

Ответ 1

Замените три команды echo в конце вашего script на:

echo -e "{\"hostname\":\""$hostname"\", \"distro\":\""$distro"\", \"uptime\":\""$uptime"\"}"

the -e для разрешения интерпретации обратных слэшей

или с этим:

printf '{"hostname":"%s","distro":"%s","uptime":"%s"}\n' "$hostname" "$distro" "$uptime"

Некоторые из последних дистрибутивов имеют файл: /etc/lsb-release или подобное имя (cat /etc/*release). Таким образом, вы могли бы покончить с зависимостью от Python:

distro=$(awk -F= 'END { print $2 }' /etc/lsb-release)

В стороне, вам, вероятно, следует покончить с использованием обратных сигналов. Они немного старомодны.

Ответ 2

Мне гораздо проще создать json, используя cat:

cat <<EOF > /your/path/myjson.json
{"id" : "$my_id"}
EOF

Ответ 3

Я вообще не bash -ninja, но я написал решение, которое отлично работает для меня. Итак, я решил поделиться им с сообществом.

Прежде всего, я создал bash script, называемый json.sh

arr=();

while read x y; 
do 
    arr=("${arr[@]}" $x $y)
done

vars=(${arr[@]})
len=${#arr[@]}

printf "{"
for (( i=0; i<len; i+=2 ))
do
    printf "\"${vars[i]}\": ${vars[i+1]}"
    if [ $i -lt $((len-2)) ] ; then
        printf ", "
    fi
done
printf "}"
echo

И теперь я могу легко выполнить его:

$ echo key1 1 key2 2 key3 3 | ./json.sh
{"key1":1, "key2":2, "key3":3}

Ответ 4

@Jimilian script был очень полезен для меня. Я немного изменил его, чтобы отправить данные в zabbix auto discovery

arr=()

while read x y;
do
    arr=("${arr[@]}" $x $y)
done

vars=(${arr[@]})
len=${#arr[@]}

printf "{\n"
printf "\t"data":[\n"

for (( i=0; i<len; i+=2 ))
do
     printf "\t{  "{#VAL1}":\"${vars[i]}\",\t"{#VAL2}":\"${vars[i+1]}\"  }"

    if [ $i -lt $((len-2)) ] ; then
        printf ",\n"
    fi
done
printf "\n"
printf "\t]\n"
printf "}\n"
echo

Вывод:

    $ echo "A 1 B 2 C 3 D 4 E 5" | ./testjson.sh
{
    data:[
    {  {#VAL1}:"A", {#VAL2}:"1"  },
    {  {#VAL1}:"B", {#VAL2}:"2"  },
    {  {#VAL1}:"C", {#VAL2}:"3"  },
    {  {#VAL1}:"D", {#VAL2}:"4"  },
    {  {#VAL1}:"E", {#VAL2}:"5"  }
    ]
}

Ответ 5

Я написал крошечную программу на Go, json_encode. Это хорошо работает в таких случаях:

$ ./getDistro.sh | json_encode
["my.dev","Ubuntu 17.10","4 days, 2 hours, 21 minutes, 17 seconds"]

Ответ 6

data=$(echo  " BUILD_NUMBER : ${BUILD_NUMBER} , BUILD_ID : ${BUILD_ID} , JOB_NAME : ${JOB_NAME} " | sed 's/ /"/g')

output => data="BUILD_NUMBER":"29","BUILD_ID":"29","JOB_NAME":"OSM_LOG_ANA"