我正在尝试在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返回错误的块。
有更“可靠”的方法吗?
答案 0 :(得分:2)
问题中代码的问题在于:
tr -d '/100'
该命令只删除所有字符:'/', '1', '0'
。
-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}