Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lizard
0 / 0 / 0
Регистрация: 20.09.2011
Сообщений: 14
#1

Парсер лога с использованием boost::regex - C++

10.11.2011, 23:16. Просмотров 583. Ответов 1
Метки нет (Все метки)

Всем привет.

Есть задача пропарсить лог антивирусника с ипользованием boot:: regex, и выдать формат Filename - Diagnosis. Лог не очень удобен, так как записывает все в несколько строк.
Алгоритм: программа находит имя просканированного файла и проверяет будет ли дальше сообщение о вирусах.

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

Подскажите что неправильно с while`ами?

текст лога:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Avira / Windows Version 1.9.150.0
Copyright (c) 2010 by Avira GmbH
All rights reserved.
 
engine set:         8.2.6.84
VDF Version:        7.11.16.66 
 
 
Scan start time: 09.11.2011 23:42:17
Command line: scancl.exe C:\tmp\ --log=C:\log\log 
 
configuration file: C:\avira\scancl.conf
C:\tmp\1.jpg
 Date: 02.11.2011 Time: 11:13:39  Size: 47999
 
C:\tmp\bdc.exe
 Date: 17.10.2011 Time: 21:06:17  Size: 137728
 
C:\tmp\client.exe
 Date: 19.10.2011 Time: 19:47:51  Size: 14336
 
C:\tmp\eicar.com.txt
 Date: 09.11.2011 Time: 23:41:06  Size: 68
 ALERT: [Eicar-Test-Signature] C:\tmp\eicar.com.txt <<< Contains signature of the Eicar-Test-Signature virus
C:\tmp\server.exe
 Date: 18.10.2011 Time: 19:33:52  Size: 14848
 
C:\tmp\settings.ini
 Date: 28.10.2011 Time: 13:04:02  Size: 8192
 
                                                                                
 
Statistics :                
    Directories............... : 1
    Files..................... : 6
        Infected.............. : 1
            Ignored........... : 1
        Warnings.............. : 0
        Suspicious............ : 0
    Infections................ : 1
    Time...................... : 00:00:01
код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string> 
#include <boost/regex.hpp>
#include <fstream>
 
using namespace std;
const int BUFSIZE = 10000;
int main()
{
 
char buf[BUFSIZE];
std::string name, iname, diagnosis;   
 
static const boost::regex infected("(ALERT:.*?.C:.tmp.*?)+(([a-zA-Z0-9]+\\.)+[a-zA-Z]{2,4})+(.<<<.+[a-zA-Z_])");
static const boost::regex healthy("(^C:.tmp.*?)+(([a-zA-Z0-9]+\\.)+[a-zA-Z]{2,4})");
 
ifstream in;
in.open("C:\\log\\avira_log.txt");
 
 
while (!in.eof()) 
{
in.getline(buf, BUFSIZE-1);
std::string s = buf;
    boost::smatch m;
    
    if ( boost::regex_search( s, m, healthy ) ) {
        
                
   name.assign(m[2]);
   cout << "Name: "<< name <<"  diagnosis:";
    
   
   // infected files
  
   while (!in.eof()) 
{
in.getline(buf, BUFSIZE-1);
std::string c = buf;
    
 
    if ( boost::regex_search( c, m, infected ) ) {
        
   iname.assign(m[2]);
   diagnosis.assign(m[4]);
 
   if ( name == iname)
   cout <<  diagnosis << endl;
   else
       cout << "OK"<< endl;
    } 
 }
}
}
 
system("pause");
 
}


Ошибка элементарная где-то, но я не заметил(

Буду благодарен помощи (:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2011, 23:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Парсер лога с использованием boost::regex (C++):

std::regex и boost::regex - C++
Что-то я не пойму что реализация их различна ? #include &lt;iostream&gt; #include &lt;string&gt; //#include &lt;regex&gt; //using namespace...

Регулярное выражение boost::regex - C++
Здравствуйте форумчане. Не получается написать регулярное выражения для разбора такой строки: g=p1#s=p1,p2#t=p1 g, s, t - имена...

Boost::regex не могу сформировать ссылку на паттерн при поиске - C++
Необходимо найти 2 повторяющихся заголовка и объединить некоторое содержимое через replace. Хотел создать выражение для поиска: ...

Вылетает boost::regex в windows forms, в консоли всё нормально - C++
работаю с формой, подключаю &lt;boost/regex.hpp&gt;. Компиляция проходит без ошибок, но когда нажимаю f5 вылетает ошибка: &quot;Debug assertion...

Считывание из лога - C++
Привет! У меня есть лог следующего формата: IP_adress time message size timeout. В качестве разделителя - пробел. Мне нужно из каждой...

Создание лога программы - C++
сем доброго времени суток! Мне нужно сделать ведение всего происходящего в программе и вывод этого в файл, тоесть нужен лог прогрммы. ...

1
talis
793 / 545 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
10.11.2011, 23:20 #2
lizard, смотрите:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <string>
#include <boost/regex.hpp>
#include <fstream>
 
using namespace std;
const int BUFSIZE = 10000;
 
int main()
{
 
    char buf[BUFSIZE];
    std::string name, iname, diagnosis;
 
    static const boost::regex infected( "(ALERT:.*?.C:.tmp.*?)+(([a-zA-Z0-9]+\\.)+[a-zA-Z]{2,4})+(.<<<.+[a-zA-Z_])" );
    static const boost::regex healthy( "(^C:.tmp.*?)+(([a-zA-Z0-9]+\\.)+[a-zA-Z]{2,4})" );
 
    ifstream in;
    in.open( "C:\\log\\avira_log.txt" );
 
 
    while( !in.eof() )
    {
        in.getline( buf, BUFSIZE - 1 );
        std::string s = buf;
        boost::smatch m;
 
        if( boost::regex_search( s, m, healthy ) ) 
        {
            name.assign( m[2] );
            cout << "Name: " << name << "  diagnosis:";
            
            // infected files
 
            while( !in.eof() )
            {
                in.getline( buf, BUFSIZE - 1 );
                std::string c = buf;
 
 
                if( boost::regex_search( c, m, infected ) ) 
                {
 
                    iname.assign( m[2] );
                    diagnosis.assign( m[4] );
 
                    if( name == iname )
                        cout <<  diagnosis << endl;
                    else
                        cout << "OK" << endl;
                } // if( boost::regex_search( c, m, infected ) ) 
                
            } // while( !in.eof() )
            
/*-------------------> вот тут уже in.eof() == true <--------------------------------------------- */
            
        } // if( boost::regex_search( s, m, healthy ) )
        
    }// while( !in.eof() )
 
    system( "pause" );
 
}
Код ваш, только оформление подкантовал.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2011, 23:20
Привет! Вот еще темы с ответами:

Создание лога работы программы - C++
Подскажите как можно создать лог программы, который будет записываться в файл.

При записи Лога не заполняется файл - C++
Добрый день, подключил к готовому проекту Лог файл, чтобы прочитать некоторые данные. И из одних классов и функции все читается а из других...

regex - C++
как через регулярки подсчитать количество слов в стоке??? я пробовал так: #include &lt;iterator&gt; #include &lt;iostream&gt; #include &lt;string&gt;...

Regex в С++ - C++
Здравствуйте! Я хочу найти все вхождения подстроки типа 1+1 в строку. std::string str = &quot;0011011000001&quot;; std::regex rx (&quot;1+1&quot;); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru