2015-04-02 4 views
1

Допустим, у меня есть такой файл с информацией о интернет-потока в нем (файл содержит неограниченное количество строк):Как определить погоду недавно появившиеся строки в файле являются новыми (уникальными) с использованием perl?

startTime      sourceIP destinationIP 
2015-03-31 08:47:27.671  10.0.26.48  10.0.26.255 
2015-03-31 08:47:28.108  10.50.26.180  10.90.26.255 
2015-03-31 08:47:35.015  10.0.26.74 255.255.255.255 
         ... 
2015-03-31 16:18:25.365  196.0.26.13  224.0.0.252 
2015-03-31 16:18:32.718  10.46.26.13  224.0.0.252 
2015-03-31 16:18:46.941  188.0.26.98  177.0.26.255 
2015-03-31 16:18:58.336  10.0.26.57  10.0.26.255 
2015-03-31 15:53:37.451  50.0.26.13  224.0.0.252 
2015-03-31 15:53:55.086  10.0.26.13  40.30.0.252 
2015-03-31 15:53:55.097  128.0.26.13  224.0.0.252 
         ... 
2015-04-01 22:38:43.500 192.168.0.109 78.57.218.154 
2015-04-01 22:38:43.500 213.159.38.184 192.168.0.109 
2015-04-01 22:38:46.359 178.250.32.43 192.168.0.109 
2015-04-01 22:38:53.269 213.159.38.184 192.168.0.109 
2015-04-01 22:38:53.269 192.168.0.109 213.159.38.184 
2015-04-01 22:39:14.995 54.83.28.184 192.168.0.109 

То, что я хочу сделать, это определить погоды новоявленный IP-адреса не были перечислены в любом месте выше, поэтому я могу отметить их как новые и сохранить их в другом месте. Я считаю их новыми, даже если они появятся в последние несколько дней.

Что было бы лучшим программным решением с perl?

+0

Прочитать строку. Если это «молодой» достаточно, проверьте IP-адрес на значения в хеше. Если хэш содержит IP-адрес, это означает, что он появился раньше. Если нет, это новый адрес. Но я предполагаю эту логику, если для скрипта вы будете выполнять, когда вам нужна информация. – AntonH

+0

Является ли этот файл постоянным (похоже на syslog), и вы читаете его аналогично «tail -f»? Или вы просто разбираете его каждый раз и делаете логику? –

+0

Согласитесь с AntonH, используйте хэш, IP как ключ, дату-время как значение. если хеш-запись является undef, ее новая. Если он был определен, сравните значение (дата-время) для разницы (1 или 2 дня). Не забудьте обновить хэш-значение только что прочитанной строки. –

ответ

0

Хеш обычно используется для выполнения таких задач. Ожидаем, что мы определили время, с которого IP считается .

use strict; 
use warnings; 

sub parse_time { 
    local $_ = shift if @_; 
    split /[-\s:]+/; 
} 

sub cmp_array { 
    my $ref = shift; 
    for my $i (0 .. $#$ref) { 
     my $cmp = $ref->[$i] <=> $_[$i]; 
     return $cmp if $cmp; 
    } 
    return(); 
} 

die "Not enough parameners" unless @ARGV; 

my $since = [ parse_time(shift) ]; 
my %seen; 
while (<>) { 
    my ($date, $time, @ips) = split; 
    next unless @ips > 1; # expect at least two IP, otherwise malformed data; 
    if (cmp_array($since, parse_time("$date $time")) < 0 .. 0) { 
     exists $seen{$_} or print "$date $time $_\n" for @ips; 
    } 
    @seen{@ips} =(); 
} 

Пример вывода

$ perl code.pl '2015-04-01 22:38:43' file.txt 
2015-04-01 22:38:43.500 192.168.0.109 
2015-04-01 22:38:43.500 78.57.218.154 
2015-04-01 22:38:43.500 213.159.38.184 
2015-04-01 22:38:46.359 178.250.32.43 
2015-04-01 22:39:14.995 54.83.28.184 

Если вы хотите знать, если какой-то IP был появился первый раз за последние два дня, вы можете использовать

perl code.pl "$(date --date='2 days ago' '+%Y-%m-%d %H:%M:%S')" file.txt | grep 192.168.0.109 

Например

$ perl code.pl "$(date --date='9 days ago' '+%Y-%m-%d %H:%M:%S')" file.txt | grep -q 192.168.0.109 && echo NEWBIE || echo OLD DOG 
NEWBIE 

Но в этом случае у вас нет hav e для использования Perl вообще

(cat file.txt; echo $(date --date='2 days ago' '+%Y-%m-%d %H:%M:%S') MY_SUPER_DELIMITER) | 
sed 's/\s\+/\t/g' | sort | cut -f 3,4 | sed '/^MY_SUPER_DELIMITER$/,$d' | 
grep -q 192.168.0.109 && echo OLD DOG || echo NEWBIE 
+0

В вашем примере, что будет работать для меня, будет случай, когда я могу искать не по дате, а по ip-адресу. Вместо написания «2015-04-01 22:38:43» я хочу написать ip-адрес, например 192.168.0.109. И если этот IP-адрес появился ТОЛЬКО за последние два дня, я бы рассмотрел его как новый и экспортировал его в файл. Любые решения? –

+0

@ DžiugasBalčytis: Я не уверен, что я тебя понимаю. Итак, вы хотите жестко ограниченный лимит _last два дня_, и вы готовы вставить IP вручную? Это звучит странно для меня. В любом случае, вы можете изменить мое решение или написать собственное решение. Это еще проще. Так же, как разделить файл по дате, а затем grep для IP. –

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

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