将包含模式的行与下一行交换

将包含模式的行与下一行交换

我目前有以下代码,可以很好地输出有关我周围无线网络的一些信息:

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
)

相关内容