コロンで区切られた値のペアを解析し、フィールドにエスケープされたコロン文字を使用します。

コロンで区切られた値のペアを解析し、フィールドにエスケープされたコロン文字を使用します。

nmcliコマンドの出力(コロンで区切られた値)を処理しようとしていますが、MACまたはBSSIDからエスケープされたコロンを処理/無視することはできません。 awk、jq、sed、regexを試しましたが、私は理解していません...

パイプラインコマンド:

nmcli -f SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY -t dev wifi

出力例:

WiFi:00\:0A\:97\:6F\:7B\:AC:165:5660 MHz:15:

BSSIDを行/フィールドリストの最後に移動し、最後のフィールドだけを切り捨てるとうまくいきますが、今は誇りに思うでしょう。助けてください!

私は本当に良いことをしているこの既存のスタックオーバーフロースレッドを見つけましたが、最終的にMAC!@%$アドレスでエスケープされたコロンを無視する方法などの問題に直面しました。 コロンで区切られた値ペアの解析

最近(読める)試み:

printf '%s' "$(nmcli -f SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY -t dev wifi)" | jq -sR 'split("\n") | map(split(":")) | map({"SSID": .[0], "BSSID": .[1], "CHAN": .[2], "RATE": .[3], "FREQ": .[4], "SIGNAL": .[5], "SECURITY": .[6]})'

問題の出力:

...
{
"SSID": "WiFi",
"BSSID": "00\\",
"CHAN": "0A\\",
"RATE": "97\\",
"FREQ": "6F\\",
"SIGNAL": "7B\\",
"SECURITY": "AC"
},
...

可能であれば、上記のようにコロンをエスケープするのではなく、コロンを所定の位置に保持するにはJQが必要です...単にPythonと言わないでください...

ベストアンサー1

以下はいくつかの考慮事項です。

  • nmcli次の方法でフィールドの脱出を防ぐことができます。--escape/-e no
  • jsonフィールド名を引用する必要はありません(特殊文字を除く)。
  • SSID常に返されないため、プレースホルダ()Securityを追加しました。--

    printf '%s' "$(nmcli -f SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY -e no -t dev wifi)" |
      jq -sR 'split("\n") |
        map(split(":") |
        {SSID: (if .[0] == "" then "--" else .[0] end), 
          BSSID: .[1:6] | join(":"),
          CHAN: .[7],
          FREQ: .[8],
          SIGNAL: .[9],
          SECURITY: (if .[10]  == "" then "--" else .[10] end)})'
    

おすすめ記事