У меня есть входной файл, как это:

ATTACK-RESPONSES id check returned root
BACKDOOR ACKcmdC trojan scan
BACKDOOR hack-a-tack attempt 
BACKDOOR WinCrash 1.0 Server Active
ICMP Destination Unreachable Port Unreachable
ICMP Destination Unreachable Port Unreachable
ICMP Destination Unreachable Port Unreachable
SNMP trap tcp

Выход:

1 ATTACK-RESPONSES id check returned root
3 BACKDOOR
3 ICMP Destination Unreachable Port Unreachable 
1 SNMP trap tcp 

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

Как я мог это сделать?

1 ответ1

1

Это довольно сложно с одним проходом и еще сложнее, если вы не предполагаете, что старт должен быть одинаковым.

Вы можете написать Perl-скрипт, который сопоставляет регулярные выражения с предыдущими строками, например, так:

my @words_on_line = split(/ /, $current_line);
my $i = 0; my $substring = ''; my $expression = '';
do {
  $expression = join(' ', $words_on_line[0..$i++]);
  if ($previous_line =~ m/^$expression/) {
    $substring = $expression;
  }
} until ($substring ne $expression);

Затем вам также необходимо проверить следующую строку и, возможно, уменьшить совпадение подстроки, например, когда у вас есть

FOO a b c
FOO a b
FOO d

Первый матч (от 2 до 1) даст вам FOO a b , но, сравнивая ниже, вы получите только FOO .

Что сводится к следующему: вам нужно буферизовать ваши строки до тех пор, пока вы не получите строку без совпадения. Таким образом, вместо печати вы бы сделали что-то вроде

unless ($substring) {
  push @buffer, $current_line;
  foreach (@buffer) {
    unless (m/$substring/) {
      $buffer_substring = $substring;
    }
  }
} else {
  print scalar @buffer, " $buffer_substring\n";
}

И тогда вы просто объедините это.

Если это не «первое общее начало, начинающееся с начала строки», вам нужно будет проверить каждую возможную последовательность слов по каждой возможной последовательности слов в других строках, что является чрезвычайно сложным и которое я не буду здесь воспроизводить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .