2016-11-14 3 views
0

У меня есть текстовый файл с 700 000 строк попыток входа в систему, некоторые из которых успешны, но в основном - нет. Вот пример:Найти все строки текста, которые имеют XXX в EOL

login attempt 2 to server IP as user_name - password failed 
login attempt 3 to server IP as user_name - password failed 
login attempt 4 to server IP as user_name - **successful** 
login attempt 5 to server IP as user_name - password failed 
login attempt 6 to server IP as user_name - **successful** 

и так далее. Как я могу удалить все строки, которые не заканчиваются с «успешным» словом позер-ocode:

  1. преобразовать все линии в отдельные массивы с каждым словом как элемент массива
  2. , чтобы написать что-то вроде этого (псевдокод):

    while(line_number <= 700000) { 
    
         $all_occurrences .= (end($array) == 'successful') ? whole_line : ''; 
    } 
    

так только они останутся:

> login attempt 4 to server IP as user_name - **successful** login 
> attempt 6 to server IP as user_name - **successful** 

Любые мысли?

Спасибо!

+2

, если это всего лишь один раз задача, это довольно легко сделать с помощью Баш строки на Linux. 'grep success biglogfile.log>./login.log' –

+0

Спасибо Duane. Я бы хотел разобраться с решением PHP, несмотря на то, что ваш ответ решает мою проблему. – Rossitten

+0

Вы можете использовать регулярное выражение или 'strpos', если' success' будет только когда-либо появляться на линии один раз. – chris85

ответ

2

Лучше всего читать файлы по строкам, чтобы вы не сталкивались с ограничениями памяти.

Решение 1:

<?php 

$if = '/tmp/login.attempts'; 
$of = '/tmp/login.attempts.purged'; 
$ifh = fopen($if, 'r'); 
$ofh = fopen($of, 'w'); 

while(($line = fgets($ifh)) !== false) { 
    if(preg_match('/successful/', $line)) { 
     fwrite($ofh, $line); 
    } 
} 

fclose($ifh); 
fclose($ofh); 

?> 

Или, если вы хотите использовать массивы, как ваш код SUDO.

Решение 2:

<?php 

$if = '/tmp/login.attempts'; 
$contents = file_get_contents($if); 

$all_attempts = explode("\n", $contents); 

$successful_attempts = array(); 

foreach($all_attempts as $attempt) { 
    if(preg_match('/successful/', $attempt)) { 
     $successful_attempts[] = sprintf("%s", $attempt); 
    } 
} 

// The successful_attempts array contains all your entries 
//print_r($successful_attempts); 
?> 
+0

о, мужчина. Большое вам спасибо за ваше время и использование вашей логики! Мне все еще нужно, чтобы последнее слово каждой строки было «успешным», но я буду иметь дело с этим. Вы только что помогли мне найти, что мы были взломаны = (((нужно сменить пароли ... Спасибо – Rossitten

+1

@DuaneLortie был прав в своем комментарии, а самый простой/лучший ответ, если в среде linux/unix - 'grep success/path/to/file.log' – varlogtim

+0

да, я согласен, но у меня есть причины использовать PHP здесь и поэтому, попросил помочь мне с PHP-решением. Тем не менее - еще раз - спасибо DuaneLortie за предложение!)) – Rossitten

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