私は次のような結果を生成する結果を解析しようとしています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でシェルコマンドを実行できることを覚えておいてください。