我运行以下命令:
sudo iwlist eth0 scan
并获得如下输出:
Cell 01 - Address: AB:CD:EF:12:34:56
ESSID:"name"
Protocol:IEEE 802.11g
Mode:master
Frequency:2.417 GHz (Channel 2)
Encryption key:on
我不会费心填写所有内容,因为我正在尝试修复一台笔记本电脑,而且我无法简单地复制输出。
grep
如何使用、awk
、等内置工具sed
根据特定条件获取信息?例如:
我想在知道 essid 的情况下获取 mac 地址。我也不想依赖Cell #
或行位置。知道常用信息(例如 mac 之前的 Address 一词)就可以了。
预期输出:
AB:CD:EF:12:34:56
我想在变量中使用它,如下所示:
sudo iwconfig eth1 ap $(command)
其中命令将产生预期结果。如果有另一种方法将结果推送为变量,>
或者使用其他方法,那么也可以。(command > sudo iwconfig eth1 ap $1
)
谢谢。
答案1
我个人更喜欢纯 bash。下面的脚本应该可以满足您的要求。
get_mac_of_essid() {
target_essid="$1"
[ -z "$target_essid" ] && return
interface=eth0
# Ask for password now instead of in the middle of pipe below
sudo -v
mac="" ; essid=""
{
while read line ; do
set -- $line
if [ "$1" = Cell ] ; then
# New network, so reset variables
mac="" ; essid=""
shift 3
fi
case "$1" in
Address:)
mac="$2" # MAC is on this line, second field
;;
ESSID:*)
essid="${1#ESSID:}" # ESSID is on this line, first field after ':'
essid="${essid#\"}" # Remove duoble quote at start
essid="${essid%\"}" # Remove double quote at end
;;
esac
if [ "$essid" = "$target_essid" ] && [ ! -z "$mac" ] ; then
echo "$mac" ; return
fi
done
} < <(sudo iwlist $interface scan)
}
将上述内容粘贴到您的终端后,您应该能够get_mac_of_essid name
根据需要多次运行以获取与网络“名称”关联的 MAC 地址。
答案2
AWK 非常强大,非常适合此用途。基本上,您需要:
- 将地址保存在地址行中
- 如果 ESSID 与您的值匹配,则打印它
我能想到的最短版本:
sudo iwlist wlan0 scan|awk '/Address:/{a=$5}/ESSID:"name"/{print a}'
/pattern/
{...}
是与输入进行比较的正则表达式。如果匹配,则执行花括号()后面的部分。
该awk
命令逐行处理输入:
- 如果某行与 匹配
Address:
,则第五个字段将存储在名为 的变量中a
。字段是以空格分隔的行。 - 如果某一行匹配
ESSID:"name"
,则a
打印变量(匹配的最后一个地址)。
两个规则都会执行,但是 1 先于 2,因此a
始终被设置。
答案3
我建议学习cut
命令。它使这项任务变得简单。请原谅echo
,但我想在原始数据上进行演示。
$ echo 'Cell 01 - Address: AB:CD:EF:12:34:56
ESSID:"name"
Protocol:IEEE 802.11g
Mode:master
Frequency:2.417 GHz (Channel 2)
Encryption key:on' | egrep Address | cut '-d:' -f2-
AB:CD:EF:12:34:56
$ echo 'Cell 01 - Address: AB:CD:EF:12:34:56
ESSID:"name"
Protocol:IEEE 802.11g
Mode:master
Frequency:2.417 GHz (Channel 2)
Encryption key:on' | egrep ESSID: | cut '-d"' -f2
name