2013-12-16 41 views
2

我試圖創建Bash一個JSON兼容輸出,可通過的NodeJS讀取&蟒蛇:bash的輸出轉換爲JSON /詞典

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

這裏的未經過濾的結果:

iwconfig wlan0    
wlan0  IEEE 802.11bg ESSID:"[email protected]" Nickname:"<[email protected]>" 
      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":} 

「噪聲」值永遠不會被捕獲,有時printf返回錯誤的塊。

有沒有更可靠的方法來做到這一點?

+0

感謝所有的建議,但我真的需要修復我的代碼版本,因爲我最終與REGEX和所選的@Thrustmaster解決方案真正的鬥爭。 – crankshaft

回答

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"}"}' 
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}); }' 
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}