使用 grep 输出中的单独行

使用 grep 输出中的单独行

我正在尝试从 grep 中获取行并将它们排序到另一个命令中,我用于 grep atm 的命令如下(对于我将要使用的内容来说还没有被足够的切割,但这提供了更好的上下文) :

iwlist wlan0 scanning | grep -oE '(ESSID:|Quality=|Encryption Key:).*'

输出如下所示(但会根据我的计算机的位置而变化):

Quality=64/70 Signal Level=-49dBm
Encryption key:on
ESSID:"Hringdu_20558"
Quality=61/70 Signal Level=-48 dBm
Encryption key:on
ESSID:"SiminnEBE932"
Quality=30/70 Signal Level=-71 dBm
Encryption key:on
ESSID:"Siminn106C46
Quality=28/70 Signal Level=-83 dBm
Encryption key:on
ESSID:"SiminnECC63F"

我想单独使用这些行来执行另一个命令

$ssid=$(zenity --list --text "Available Networks" --list --column "ESSID" --column "Secure" --column "Signal" "$ESSID" "$ENC" "$Signal");

这些是快速无线网络选择提示的开始。 $ESSID/$ENC/$Signal 将基于早期 grep 的输出,所以在使用 cut/awk/ 对其进行切割后,我需要在对 grep 输出进行更多处理后,最终看起来像这样sed:

91%
on
Hringdu_20558

(注:我通过将 64 乘以 10 再除以 7 得到百分比;64*10/7)

是通过脚本将每个检测到的 ESSID 递归应用这些行到 zenity 命令中。并增加问题;您可能会注意到 grep 输出与 zenity 命令的顺序相反,因此这意味着“Hringdu_20558”必须首先进入,而“87%”必须最后进入。

换句话说,在这个特定场景中,我需要以某种方式从 grep 输出中获取第三行,并将其附加到另一个命令,然后处理前两行,并在我开始的行之后的第三行重复此操作,直到没有更多的线路了。

本质上,根据上述输出,最终的 zenity 命令应该看起来像这样:

$ssid=$(zenity --list --text "Available Networks" --list --column "ESSID" --column "Secure" --column "Signal" "Hringdu_20558" "on" "91%" "SiminnEBE932" "on" "87%" "Siminn106C46" "on" "43%" "SiminnECC63F" "on" "40%");

我怎样才能做到这一点?只用基本的 shell 脚本就可以完成吗?

答案1

我最终得到这样的结果:

ssid=$(iwlist wlan0 scanning |
awk -F: '
BEGIN{ printf "zenity --list --text \"Available Networks\" --list --column ESSID --column Secure --column Signal "; }
/Quality/{ split($0,x,"="); Quality = int(x[2]*100/70+.5); }
/Encryption/{ Encryption = $2; }
/ESSID/{ ESSID = $2;
         printf "%s \"%s\" \"%s%%\" ", ESSID, Encryption, Quality
}' |
sh)

并没有真正使用 grep,但它可以满足您的要求。

相关内容