![使用 grep 输出中的单独行](https://linux22.com/image/72024/%E4%BD%BF%E7%94%A8%20grep%20%E8%BE%93%E5%87%BA%E4%B8%AD%E7%9A%84%E5%8D%95%E7%8B%AC%E8%A1%8C.png)
我正在尝试从 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,但它可以满足您的要求。