我目前有以下代码,可以很好地输出有关我周围无线网络的一些信息:
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}'
IE:
/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
)