регулярное выражение для получения 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-адреса API геолокации Google и получить местоположение.

Любые идеи?

Спасибо!


person Tzar    schedule 20.01.2014    source источник


Ответы (3)


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

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.

person Magoo    schedule 20.01.2014
comment
Спасибо @Magoo .. Это сработало. Но проблема в том, что я пытаюсь реализовать это на C++. Не могу использовать файл. Любые другие предложения? Подстановка netsh вместо имени файла не работает.. - person Tzar; 20.01.2014

Вы можете «разделить» строку на символ :, используя это (при условии, что вы можете сохранить вывод своей команды в файл 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
person Loïc MICHEL    schedule 20.01.2014
comment
Спасибо... Но я не могу использовать файл в своем коде. Я использую CPP. Прямое использование netsh не работает... - person Tzar; 20.01.2014
comment
вы не можете использовать регулярное выражение в С++? почему вы хотите парсить в пакетном режиме?? - person Loïc MICHEL; 20.01.2014
comment
Я все еще новичок в CPP. Я пытаюсь создать массив этих MAC-адресов, которые будут переданы в API геолокации Google. Можете ли вы помочь с фрагментом кода cpp для этого? - person Tzar; 20.01.2014
comment
@Tzar Я не могу, но вы должны отредактировать свой вопрос, удалить тег пакетного файла и вместо него поставить c++. С уважением - person Loïc MICHEL; 20.01.2014

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

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

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

person Tzar    schedule 21.01.2014