【问题标题】:Parse iwlist command output of wireless survey with sed and regex使用 sed 和正则表达式解析无线勘测的 iwlist 命令输出
【发布时间】:2014-11-12 03:01:33
【问题描述】:

我有这个命令,我在谷歌上找到了,但我需要输出中的 mac 地址

iwlist ath0 scan | sed -ne 's#^[[:space:]]*\(Quality=\|Encryption key:\|ESSID:\)#\1#p' -e 's#^[[:space:]]*\(Mode:.*\)$#\1\n#p'


Output
ESSID:"Banban"
Quality=18/94  Signal level=-78 dBm  Noise level=-99 dBm
Encryption key:on

还有什么方法可以获取mac地址吗?该字段显示为地址:00:00:00:00:00:00:00:00

命令 iwlist ath0 scan 的原始输出

  ath0      Scan completed :
      Cell 01 - Address: DC:9F:DB:90:AB:24
                ESSID:"Banban"
                Mode:Master
                Frequency:5.57 GHz (Channel 114)
                Quality=18/94  Signal level=-78 dBm  Noise level=-99 dBm
                Encryption key:on
                Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
                          36 Mb/s; 48 Mb/s; 54 Mb/s
                Extra:bcn_int=100
                IE: IEEE 802.11i/WPA2 Version 1
                    Group Cipher : CCMP
                    Pairwise Ciphers (1) : CCMP
                    Authentication Suites (1) : PSK
                Extra:wme_ie=dd180050f2020101850003a4000027a4000042435e0062322f00
                Extra:ath_ie=dd0900037f01010000ff7f
                Extra:ubnt_ie=dd0e00156d0000000102b5e102021200
                Extra:htcap_ie=cc011bffff000000000000000000000000000000000000000000
                Extra:mtik_ie=dd26000c42000000011e000000001f660902ff0f41502d4d4f4d454e544f2d320000000000000000
      Cell 02 - Address: DC:9F:DB:08:49:43

【问题讨论】:

  • 您的原始输出中有两个地址,它们都不符合您在问题中提出的要求。
  • “我如何用 Y 做 X?”一般来说,提问是一种不好的方式——Y 可能不是做 X 的最佳方式。
  • 肯定有比解析命令输出更好的方法来获取此信息。看起来 iwlist 正在使用旧的 ioctl 接口。一定有更新的东西。

标签: regex linux bash parsing sed


【解决方案1】:

您可以使用grep-E(启用ERE)和--only-matching 选项来获得所需的输出。

iwlist ath0 scan | grep -oE '(ESSID:|Address:|Quality=|Encryption key:).*'
Address: DC:9F:DB:90:AB:24
ESSID:"Banban"
Quality=18/94  Signal level=-78 dBm  Noise level=-99 dBm
Encryption key:on
Address: DC:9F:DB:08:49:43

您甚至可以使用grep 的默认 RE,即 BRE,尽管它可能不那么可读:

iwlist ath0 scan | grep -o '\(ESSID:\|Address:\|Quality=\|Encryption key:\).*'
Address: DC:9F:DB:90:AB:24
ESSID:"Banban"
Quality=18/94  Signal level=-78 dBm  Noise level=-99 dBm
Encryption key:on
Address: DC:9F:DB:08:49:43

【讨论】:

  • @CharlesDuffy 非常有效的观点。 -P 选项完全没有必要。已更新解决方案。感谢您的反馈。一如既往地欣赏它。
  • @MichaelJaros 正确,不需要。
【解决方案2】:

试试这个“awk”表达式:

iwlist ath0 scan | awk '/Quality|ESSID|Encryption key|Address/ { print $0 }'

正如 jaypal 已经指出的那样,您的输出中有两个硬件地址。两者都会匹配。输出将包括前导空格(对人类有利,对脚本不利)。如果您不喜欢这样,请使用

iwlist ath0 scan | awk '/Quality|ESSID|Encryption key|Address/ { gsub(/^[ ]+/,"") ; print $0 }' 

改为。

【讨论】:

  • ...虽然去除前导空格当然也可以在 awk 中完成。
【解决方案3】:

使用sed,扩展原命令如下:

 iwlist ath0 scan | sed \
   -ne 's#^[[:space:]]*\(Quality=\|Encryption key:\|ESSID:\)#\1#p' \
   -e 's#^[[:space:]]*\(Mode:.*\)$#\1\n#p' \
   -ne 's#^.*\(Address: \)#\1#p'

正如 Charles Duffy 所指出的,当使用 GNU sed(例如在 Linux 上)时,可以将语法简化如下(使用 -r 选项来启用扩展正则表达式):

 iwlist ath0 scan | sed -r \
   -ne 's#^[[:space:]]*(Quality=|Encryption key:|ESSID:)#\1#p' \
   -e 's#^[[:space:]]*(Mode:.*)$#\1\n#p' \
   -ne 's#^.*(Address: )#\1#p'

【讨论】:

  • +1。但是,能够在 BRE 中编写 \| 以获得与 ERE | 语法等效的行为是 GNU 扩展,如果您要使用 GNU 扩展,为什么不直接使用 sed -r 并获得正确的 ERE(并且根本不需要|() 周围的反斜杠)?
  • @CharlesDuffy 我使用了与 OP 命令相同的语法,只是扩展了命令以满足要求。也就是说,完全同意你的评论:)
  • 命令 iwlist ath0 scan | awk '/质量|ESSID|加密密钥|地址/ { gsub(/^[ ]+/,"") ; print $0 }' 效果很好,也很短,其他命令也有效我将尝试将此命令从 .net 应用程序发送到它的工作原理,谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2013-08-07
  • 2012-10-29
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2015-04-01
  • 2020-05-21
相关资源
最近更新 更多