2017-01-31 12 views
1

У меня есть файл журналов выглядит как:«электронный ф» регулярное выражение в лог-файл

'User_001','Entered server','[email protected]','2','','','0','YES','0','0',','0','192.168.1.1','192.168.1.2','0','0','0','0','0','0','0','0','0','1','0','','0','0','0','1' 
'User_002','Entered server','[email protected]','2','','','0','NO','0','0',','0','192.168.1.3','192.168.1.4','0','0','0','0','0','0','0','0','0','1','0','','0','0','0','1' 

ИЛИ

User_001 Entered server [email protected] 2 Pool_1 YES 0 0 0 192.168.1.1 192.168.1.2 0 0 0 0 0 0 0 0 0 1 0 0 1 
User_002 Entered server [email protected] 2 Pool_1 NO 0 0 0 192.168.1.3 192.168.1.4 0 0 0 0 0 0 0 0 0 1 0 0 1 

И я пытаюсь сделать регулярное выражение для экспорта в «Email IP» форматируйте содержимое.

Я попытался с регулярным выражением, как:

([A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,6}(.*)([0-9]{1,3}[\.]){3}[0-9]{1,3}) 

Но, конечно, не работает так, что получают также все содержание между 2 совпавших строк.

Как я могу игнорировать содержимое между 2 найденными строками?

Я попытался свести на нет эту часть регулярного выражения без успеха.

Спасибо всем заранее!

P.s. Мне нужно сделать это с помощью Grep

+0

Это выглядит как цитируемый CSV, так почему бы не использовать парсер CSV? –

+0

Это обычный текстовый файл, а не csv:/ –

+2

CSV-файл представляет собой текстовый файл, который содержит значения в фиксированном порядке, разделенные запятыми. Разве это не так? –

ответ

0

Это мое уродливое решение регулярное выражение (который работает):

([a-z0-9][email protected][a-z0-9.]+).*?([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) 

https://www.regex101.com/r/APfJS1/1

const regex = /([a-z0-9][email protected][a-z0-9.]+).*?([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/gi; 
 
const str = `User_001','Entered server','[email protected]','2','','','0','YES','0','0',','0','192.168.1.1','192.168.1.2','0','0','0','0','0','0','0','0','0','1','0','','0','0','0','1'`; 
 
let m; 
 

 
while ((m = regex.exec(str)) !== null) { 
 
    // This is necessary to avoid infinite loops with zero-width matches 
 
    if (m.index === regex.lastIndex) { 
 
     regex.lastIndex++; 
 
    } 
 
    
 
    // The result can be accessed through the `m`-variable. 
 
    m.forEach((match, groupIndex) => { 
 
     console.log(`Found match, group ${groupIndex}: ${match}`); 
 
    }); 
 
}

Но, как упоминалось в комментариях: а Хороший csv parser будет лучше, наверное!

PHP

$re = '/([a-z0-9][email protected][a-z0-9.]+).*?([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/i'; 
$str = 'User_001\',\'Entered server\',\'[email protected]\',\'2\',\'\',\'\',\'0\',\'YES\',\'0\',\'0\',\',\'0\',\'192.168.1.1\',\'192.168.1.2\',\'0\',\'0\',\'0\',\'0\',\'0\',\'0\',\'0\',\'0\',\'0\',\'1\',\'0\',\'\',\'0\',\'0\',\'0\',\'1\''; 

preg_match_all($re, $str, $matches); 

// Print the entire match result 
print_r($matches); 
+0

Может быть, я что-то делаю неправильно, что работает с PHP, но если мне нужно использовать одно и то же регулярное выражение с grep, то он снова не вернет весь матч. Пример команды i: grep -E -o "([a-z0-9] + @ [a-z0-9.] +). *? ([0-9] {1,3} \. [0 -9] {1,3} \. [0-9] {1,3} \. [0-9] {1,3}) " a.txt –

+0

Я добавлю эквивалент PHP, но вы никогда не указали язык в вашем вопросе! –

+0

ehm .. ну, мне нужно сделать это в grep –

 Смежные вопросы

  • Нет связанных вопросов^_^