正则表达式从 netsh wlan 获取 MAC 地址
Posted
技术标签:
【中文标题】正则表达式从 netsh wlan 获取 MAC 地址【英文标题】:regex to get MAC address from netsh wlan 【发布时间】:2014-01-20 08:07:55 【问题描述】:我正在尝试获取周围所有可用无线网络的 MAC 地址。
目前正在使用:
netsh wlan show networks mode=bssid | findstr BSSID
我得到的输出(真正的 MAC 为隐私隐藏):
BSSID 1 : 2c:ab:25:xx:xx:xx BSSID 1 : 00:22:2d:xx:xx:xx BSSID 1 : c4:3d:c7:xx:xx:xx BSSID 1 : 00:27:22:xx:xx:xx BSSID 1 : 84:c9:b2:xx:xx:xx BSSID 1 : 00:25:5e:xx:xx:xx BSSID 1 : 00:06:5a:xx:xx:xx BSSID 2 : 00:06:5a:xx:xx:xx BSSID 1 : 00:06:5a:xx:xx:xx BSSID 2 : 00:06:5a:xx:xx:xx BSSID 1 : 00:06:5a:xx:xx:xx BSSID 2 : 00:06:5a:xx:xx:xx BSSID 1 : 00:06:5a:xx:xx:xx BSSID 2 : 00:06:5a:xx:xx:xx BSSID 3 : 00:25:5e:xx:xx:xx BSSID 4 : 00:25:5e:xx:xx:xx BSSID 5 : 00:25:5e:xx:xx:xx BSSID 1 : 00:27:22:xx:xx:xx BSSID 1 : 00:27:22:xx:xx:xx BSSID 1 : fc:b0:c4:xx:xx:xx BSSID 1 : fc:b0:c4:xx:xx:xx
我需要实现一个只能输出 MAC 地址的正则表达式(即每行的最后 17 个字符) 需要将 MAC 地址存储在 C++ 中的数组中。 我当前的代码是这样获取输出的:
#include <iostream>
#include <string>
#include <stdio.h> // for _popen() and _pclose()
using namespace std;
int main()
char buff[512];
buff[0]=0;
string cmd="netsh wlan show networks mode=bssid | findstr BSSID";
FILE *fpipe = _popen(cmd.c_str(),"rt");
if(fpipe==NULL)
cout<<"Failed to open"<<endl;
else
cout<<"Opened pipe successfully";
while(fgets(buff,sizeof(buff),fpipe)!=NULL)
cout<<buff<<endl;
_pclose(fpipe);
有人可以提供一个代码 sn-p 来实现 boost regex 以仅获取数组中的 MAC 地址吗? 我的意图是将这些 MAC 地址传递给谷歌地理定位 API 并获取位置。
有什么想法吗?
谢谢!
【问题讨论】:
【参考方案1】:哦——Kayasax 就在附近!问题是输出有一个前导空格....
FOR /f "tokens=1*delims=:" %%a IN (c:\temp\mac.txt) DO (
FOR /f "tokens=*" %%c IN ("%%b") DO ECHO %%c)
应该删除那个空间。
以 Kayasax 建议的方式将文件名替换为 netsh
命令也应该适用于此...
FOR /f "tokens=1*delims=:" %%a IN (
'netsh wlan show networks mode=bssid ^| findstr BSSID') DO (
FOR /f "tokens=*" %%c IN ("%%b") DO ECHO %%c)
你知道——Kayasax 提倡的 netsh... 命令。
【讨论】:
谢谢@Magoo .. 那行得通。但这里的问题是我试图在 C++ 中实现它。不能使用文件。还有其他建议吗?替换 netsh 而不是文件名不起作用..【参考方案2】:您可以使用此“拆分”字符 :
处的字符串(假设您可以将命令的输出保存到文件 c:\temp\mac.txt )
for /f "tokens=2,* delims=:" %%i in (c:\temp\mac.txt) do echo %%i:%%j
或者你可以这样做(我无法测试)
for /f "tokens=2,* delims=:" %%i in ('netsh wlan show networks mode=bssid ^| findstr BSSID') do echo %%i:%%j
【讨论】:
谢谢...但我无法在我的代码中使用文件。我正在使用 CPP。直接用netsh不行... 你不能在 C++ 中使用正则表达式?为什么要批量解析?? 我还是 CPP 的新手。我正在尝试创建这些 MAC 地址的数组,这些地址将传递给谷歌地理定位 API。你能帮忙提供一个cpp代码sn-p吗? @Tzar 我不能,但是您应该编辑您的问题,删除批处理文件标签并改用 c++。真诚的【参考方案3】:我终于设法让它工作了。 这是我使用的代码sn-p:
#include <iostream>
#include <string>
#include <stdio.h> // for _popen() and _pclose()
#include <regex>
#include <iterator>
using namespace std;
int main()
char buff[512];
buff[0]=0;
string MacOutput;
string cmd="netsh wlan show networks mode=bssid | findstr BSSID";
FILE *fpipe = _popen(cmd.c_str(),"rt");
if(fpipe==NULL)
cout<<"Failed to open"<<endl;
while(fgets(buff,sizeof(buff),fpipe)!=NULL)
string temp = string(buff);
MacOutput.append(temp);
_pclose(fpipe);
regex mac_regex("([0-9a-f]2[:-])5[0-9a-f]2");
auto words_begin =
sregex_iterator(MacOutput.begin(), MacOutput.end(), mac_regex);
auto words_end = sregex_iterator();
int j=0;
for (sregex_iterator i = words_begin; i != words_end; ++i)
smatch match = *i;
string match_str = match.str(); //Can store the outputs in an array here!
cout << match_str << '\n';
感谢所有帮助过的人!以及我在整个 *** 中使用过的 sn-ps!
【讨论】:
以上是关于正则表达式从 netsh wlan 获取 MAC 地址的主要内容,如果未能解决你的问题,请参考以下文章