パターンを含む行を次の行に置き換えます。

パターンを含む行を次の行に置き換えます。

現在、私の周りの無線ネットワークに関するいくつかの情報を出力する次のコードがあります。

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}フォーマットし、予約済みスペースからパターンスペースまでラインを追加して印刷します。 - ラインをフォーマットして印刷します。SSIDG
/primary/{s/^[[:blank:]]*/ /;p}primaryp

答え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
)

関連情報