регулярное выражение, чтобы получить MAC-адрес от Netsh WLAN

Я пытаюсь получить 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);
}

Может ли кто-нибудь предоставить мне фрагмент кода для реализации регулярного выражения Boost, чтобы получить только MAC-адреса в массиве?
Мое намерение состоит в том, чтобы передать эти MAC-адреса в Google Geo-Locate API и получить местоположение.

Есть идеи?

Спасибо!

0

Решение

Ох — Каясакс так близко! Проблема в том, что на выходе есть пробел ….

FOR /f "tokens=1*delims=:" %%a IN (c:\temp\mac.txt) DO (
FOR /f "tokens=*" %%c IN ("%%b") DO ECHO %%c)

следует удалить это пространство.

заменяя netsh команда для имени файла в манере, предложенной Kayasax, должна работать с этим также …

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)

Вы знаете — команда netsh …, которую защищал Kayasax.

1

Другие решения

Вы могли бы «разбить» строку на символ : используя это (при условии, что вы можете сохранить вывод вашей команды в файл 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
0

Мне наконец удалось заставить это работать.
Вот фрагмент кода, который я использовал:

#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';
}
}

Спасибо всем, кто помог! & те, чьи фрагменты я использовал по всему стеку!

0
По вопросам рекламы [email protected]