現在、私の周りの無線ネットワークに関するいくつかの情報を出力する次のコードがあります。
sudo iw wlan0 scan | sed -nr '/SSID: |signal: |primary channel: /p' | sed 's/^[\t]*//g' | sed 's/^SSID: //' | sed 's/signal: / * signal: /'
(コードが長すぎたり、混乱していてもご了承ください。) 出力はおおよそ次のようになります。
* signal: -61.00 dBm
<network 1 name>
* primary channel: 10
* signal: -37.00 dBm
<network 2 name>
* primary channel: 1
* signal: -80.00 dBm
<network 3 name>
* primary channel: 11
* signal: -90.00 dBm
<network 4 name>
* primary channel: 11
iw wlan0 scan
ただし、コマンドのネイティブ形式のため、各ネットワークの信号強度は実際のネットワーク名の前に印刷されます。私が望む結果は次のとおりです。
<network 1 name>
* signal: -61.00 dBm
* primary channel: 10
<network 2 name>
* signal: -37.00 dBm
* primary channel: 1
<network 3 name>
* signal: -80.00 dBm
* primary channel: 11
<network 4 name>
* signal: -90.00 dBm
* primary channel: 11
この結果をどのように取得できますか?どういうわけかパターンを検索* signal:
したら、その行を次の行に置き換えることができるようですが、これを行う方法がわかりません。
(可能であれば、他のコマンドのように私のコマンドの最後に追加できることを望みますsed
。そうでなければ、bashのすべてのソリューションが開いています)
<network # name>
編集:上記では、これは私の周りのネットワークからいくつかの名前を削除し、そこにある実際のネットワーク名を表すものだと言いました。デフォルトでは、ネットワーク名のある行にはネットワーク名のみが含まれ、「<」や「>」などは含まれません。
答え1
GNU sedを使ってこれを試してください:
sed -ne '/signal:/{h;b};/^[^ ]/{p;x};p' file
望むより:man sed
答え2
iw --help
出力の最後の行を実行して読み込むことをお勧めします。
それ以外は、これらのパイプなしで単一のsed
呼び出しを使用できると思います。
iw wlan0 scan | sed -n '/signal:/{s/^[[:blank:]]*/ * /;h}
/^[[:blank:]]*SSID: /{s///;G;p};/primary/{s/^[[:blank:]]*/ /;p}'
つまり:
/signal:/{s/^[[:blank:]]*/ * /;h}
-signal
行をフォーマットし、h
古いスペースをコピーします。 - ラインを
/^[[:blank:]]*SSID: /{s///;G;p}
フォーマットし、予約済みスペースからパターンスペースまでラインを追加して印刷します。 - ラインをフォーマットして印刷します。SSID
G
/primary/{s/^[[:blank:]]*/ /;p}
primary
p
答え3
私のコンピュータでやってるんだけど..
sudo iw wlp0s18f2u1 scan |
sed -Ee:n -e'$!N;/^.sig/!D' \
-e'/\* pri/s/.([^\t]*\t).*(SSID:[^\t]*\t).*p/\2\1p/;t' \
-ebn
...得られた結果は次のとおりです...
SSID: ATT477A7i6
signal: -61.00 dBm
primary channel: 6
SSID: ATT5K5I6b4
signal: -65.00 dBm
primary channel: 6
SSID: ATT960
signal: -75.00 dBm
primary channel: 6
SSID: Bernardo Shores WiFi 4
signal: -77.00 dBm
primary channel: 6
GNUで動作しますsed
。より移植可能なバージョンは次のとおりです。
( t=$(printf \\t) nt=[\^$t]*$t
sudo iw wlp0s18f2u1 scan |
sed -e:n -e'$!N;/^.sig/!D' \
-e"/* pri/s/.\($nt\).*\(SSID:$nt\).*p/\2\1p/;t" \
-ebn
)