awk -F" " 1より大きいスペースで区切ります

awk -F" " 1より大きいスペースで区切ります

私は次のような結果を生成する結果を解析しようとしていますnmcli dev wifi

*  SSID                 MODE   CHAN  RATE       SIGNAL  BARS  SECURITY  
   Prk                  Infra  11    54 Mbit/s  99      ▂▄▆█            
   VIDEOTRON2255        Infra  11    54 Mbit/s  67      ▂▄▆_  WPA1 WPA2 
   a space              Infra  6     54 Mbit/s  65      ▂▄▆_  WPA2      
*  TNCAP4D0B18          Infra  11    54 Mbit/s  52      ▂▄__            

awk -F" "最初は、ほとんどすべての状況を解析するために使用しました。 Wi-Fiネットワークが接続されているすべてのデバイスa spaceはまったく機能しないことがわかりました。

だから、1つではなく2つのスペースを試してみましたが、期待した結果は出ませんでした。上記の出力の列を一貫して解析するにはどうすればよいですか?

現在のスクリプトは次のとおりです。

nmcli dev wifi | sed 's/\*//g' > /tmp/scan
networks=$(cat /tmp/scan | awk -F"  " '{print $1}' | sed '1d')
# ...
bars=$(cat /tmp/scan | awk -F"  " '{print $6}' | sed '1d')

答え1

awk -F' {2,}' # means - two or more spaces.

または

awk -F'  +' # means - one space, then one or more spaces.

このコマンドは同じ意味を持ちます。フィールド区切り文字として2つ以上のスペースを使用します。

答え2

最初の行を解析して各列が始まる場所を見つけ、列番号に基づいて別の行を解析します。たとえば、次のスクリプトはSSIDの列2を印刷します。

nmcli_output=$(nmcli dev wifi)
printf %s\\n "$nmcli_output" | awk -v column=2 '
    NR==1 {
        i=1; p=1;
        while(match($0,/^[^ ]+ +/)) {
            a[i++] = p;
            p += RLENGTH;
            $0 = substr($0, RLENGTH+1);
        }
    }
    NR!=1 {
        text = substr($0, a[column], a[column+1] ? a[column+1]-a[column] : length);
        sub(text, / +$/, "");
        print text
    }'

やりたいことに応じて、awkを何度も呼び出すのが最善の解決策ではないかもしれません。このsystem関数を使用して、awkでシェルコマンドを実行できることを覚えておいてください。

関連情報