私は書いたスクリプト出力を
nmcli --mode multiline dev wifi
JSONに変換しましたが、一貫性がありません。(結果にスペースがある場合は中断されます)、長くて読みにくいです。
結果を直接jq
。
出力nmcli
(私のスクリプトへの入力)は次のとおりです。
*:
SSID: VIDEOTRON2255
MODE: Infra
CHAN: 11
RATE: 54 Mbit/s
SIGNAL: 69
BARS: ▂▄▆_
SECURITY: WPA1 WPA2
*: *
SSID: VIDEOTRON2947
MODE: Infra
CHAN: 6
RATE: 54 Mbit/s
SIGNAL: 49
BARS: ▂▄__
SECURITY: WPA1 WPA2
次のようなものを作成したいと思います。
[{
"network": "VIDEOTRON2255",
"mode": "Infra",
"chan": "11",
"rate": "54 Mbit/s",
"signal": "69",
"bars": "▂▄▆_",
"security": "WPA1 WPA2"
},
{
"network": "VIDEOTRON2947",
"mode": "Infra",
"chan": "6",
"rate": "54 Mbit/s",
"signal": "49",
"bars": "▂▄__",
"security": "WPA1 WPA2"
}]
私は尋ねた関連質問より早く。これは最初のスクリプト元に書きました。ザイルズの答え。一部の値では機能しますが、security
スペースでは機能しませんrate
。
ベストアンサー1
あなたがリンクしたスクリプトは非常に非効率的です。使用されているモードで…役に立たない前処理をたくさんしています。
なぜならマニュアルによると、nmcli
--terse
「このモードはコンピュータ(スクリプト)処理用に設計されています。」、必須フィールドを指定し、出力をたとえばjq -sR
パイプします。
printf '%s' "$(nmcli -f ssid,mode,chan,rate,signal,bars,security -t dev wifi)" | \
jq -sR 'split("\n") | map(split(":")) | map({"network": .[0],
"mode": .[1],
"channel": .[2],
"rate": .[3],
"signal": .[4],
"bars": .[5],
"security": .[6]})'