将bash输出转换为JSON / Dictionary

时间:2013-12-16 09:00:44

标签: json bash

我正在尝试在bash中创建一个可以由nodejs&读取的JSON兼容输出。 python:

{"link":XX,"signal":YY,"noise":ZZ}

这是未经过滤的结果:

iwconfig wlan0            
wlan0     IEEE 802.11bg  ESSID:"wifi@someplace"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:2.452 GHz  Access Point: C8:4C:75:20:B4:8E   
          Bit Rate:54 Mb/s   Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:A022-1191-3A   Security mode:open
          Power Management:off
          Link Quality=100/100  Signal level=67/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

但在应用我的过滤器之后:

iwconfig wlan0 | grep Link | tr -d '/100' | tr '=' ' ' | xargs | awk '{printf "{\"link\":"$3",\"signal\":"$6",\"noise\":"$9"}"}'

我的结果不稳定且不完整:

{"link":98,"signal":6,"noise":}
{"link":Signal,"signal":Noise,"noise":}

永远不会捕获“noise”值,有时printf返回错误的块。

有更“可靠”的方法吗?

3 个答案:

答案 0 :(得分:2)

问题中代码的问题在于:

tr -d '/100'

该命令只删除所有字符:'/', '1', '0'

来自manual for tr

  -d, --delete
      delete characters in SET1, do not translate

这不是你想要的东西。您想要的是用/100替换整个字符串""

使用:sed 's/\/100//g'代替。

... | grep Link | sed 's/\/100//g' | tr '=' ' ' | awk '{printf "{\"link\":"$3",\"signal\":"$6",\"noise\":"$9"}"}'

答案 1 :(得分:0)

您可以使用perl重组输出,方法是通过以下命令管道输出:

perl -n -E 'if ($_ =~ qr{Link Quality=(\d+)/100.*?Signal level=(\d+)/100.*?Noise level=(\d+)/100}) { print qq({"link":$1,"signal":$2,"noise":$3}); }'

答案 2 :(得分:0)

使用awk非常简单:

awk -F '[ =/]+' '$2=="Link"{printf "{\"%s\":%s,\"%s\":%s,\"%s\":%s}\n", 
                                   $2, $5, $6, $8, $10, $12}'
{"Link":100,"Signal":67,"Noise":0}