쉘 출력을 JSON으로 변환하는 방법은 무엇입니까?

쉘 출력을 JSON으로 변환하는 방법은 무엇입니까?

아래에 이 출력이 있으며 이를 JSON API 형식으로 변환하려고 합니다. 어떻게 해야 하는지 알고 싶습니다.

 rock64@rockpro64:~$ sh MACscript.sh 
 eth0
   11:1d:11:11:11:1d
 lo
   00:00:00:00:00:00

Python 스크립트를 사용해야 합니까, 아니면 쉘 스크립트를 사용하여 수행할 수 있습니까?

이것은 내 MACshell 스크립트입니다.

 rock64@rockpro64:~$ cat MACscript.sh 
 !/bin/bash
 getmacifup.sh: Print active NICs MAC addresses
 D='/sys/class/net'
 for nic in $( ls $D )
 do
   echo $nic
   if  grep -q unknown $D/$nic/operstate
   then
    echo -n '   '
    cat $D/$nic/address
  fi
 done

답변1

일반 bash를 사용하면 다음과 같이 할 수 있습니다.

json=$(
    sh MACscript.sh | {
        pairs=()
        while read interface; read ether; do
            pairs+=("\"$interface\":\"$ether\"")
        done
        IFS=,
        echo "{${pairs[*]}}"
    }
)
echo "$json"

산출

{"eth0":"11:1d:11:11:11:1d","lo":"00:00:00:00:00:00"}

답변2

다양한 방법을 사용하여 json 값을 얻을 수 있습니다. bash, python, perl...
이 웹사이트에서 이에 대한 유용한 게시물을 찾을 수 있습니다. 그러나 예는 다음과 같습니다.

  arr1=($( ls /sys/class/net))
  arr2=($( cat /sys/class/net/*/address ))

  vars1=(${arr1[@]})
  vars2=(${arr2[@]})
  len=${#arr1[@]}

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

  for (( i=0; i<len; i+=1 ))
  do
  printf "\t{  "'"{#interface}"'":\"${vars1[i]}\",\t"'"{#address}"'":\"${vars2[i]}\"  
  }"

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

산출:

{
    "data":[
    {  "{#interface}":"eth0",       "{#address}":"00:50:56:a9:c0:81"  },
    {  "{#interface}":"lo", "{#address}":"00:00:00:00:00:00"  }
    ]
}

이 웹사이트를 사용하여 json의 유효성을 검사할 수 있습니다.https://codebeautify.org/online-json-editor

관련 정보