将结果过滤到可用变量中

将结果过滤到可用变量中

我运行以下命令:

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 非常强大,非常适合此用途。基本上,您需要:

  1. 将地址保存在地址行中
  2. 如果 ESSID 与您的值匹配,则打印它

我能想到的最短版本:

sudo iwlist wlan0 scan|awk '/Address:/{a=$5}/ESSID:"name"/{print a}'

/pattern/{...}是与输入进行比较的正则表达式。如果匹配,则执行花括号()后面的部分。

awk命令逐行处理输入:

  1. 如果某行与 匹配Address:,则第五个字段将存储在名为 的变量中a。字段是以空格分隔的行。
  2. 如果某一行匹配ESSID:"name",则a打印变量(匹配的最后一个地址)。

两个规则都会执行,但是 1 先于 2,因此a始终被设置。

awk 手册页

答案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

相关内容