Вы можете сделать что-то вроде:
max {max = l; s = $0}
END {print s}'
Мы сортируем ввод, используя сравнение байтов -и -байтов(sort
в локали C ), что гарантирует, что строки с самым длинным общим префиксом являются смежными.
sed
находит самый длинный общий префикс между одной строкой и следующей, используя обратную связь BRE -ссылки (\(.*\).*\n\1
, представляющие собой захваченную последовательность символов \(.*\)
, за которой следует любое количество символов .*
, символ новой строки \n
и та же последовательность символов, что была зафиксирована ранее \1
), которую мы печатаем.
awk
находит самый длинный из них (выбирает первый во входных данных, если их несколько, поэтому он будет первым в лексическом порядке. Используйте >=
вместо >
, чтобы получить последний ).
Обратите внимание, что он находит самый длинный общий префикс с точки зрения символов . Чтобы получить его в виде байтов , установите $LC_ALL
на C
для всех 3 команд, а не только sort
. Тогда, например, в UTF -8 локалей, вместо того, чтобы найти 2 символа St
как самый длинный общий префикс между Stéphane
и Stábat
, он найдет 3 байта,St<0xc3>
, где <0xc3>
является первой половиной символов á
и é
.
В терминах расширенного графемного кластера . Например, так что между Steps
и Stéphane
(, где é
выражается как двухсимвольный кластер графем e\u0301
), он находит St
вместо Ste
, вы можете прибегнуть кperl
:
}
if ("$prev$_" =~ /^(\X*).*\n\1\b{g}/) {
$l = length($1);
if ($l > $max) {$max = $l; $s = $1}
}
$prev = $_;
END{print "$s\n"}'
(, где \X
соответствует расширенному кластеру графемы , а \b{g}
— границе расширенного кластера графемы (, для которой вам нужен perl 5.22.1 или новее )).
Если вы хотите найти самый длинный общий префикс всех строк во вводе (, а не только любых 2 строк во вводе ), как я изначально думал вы спрашивали, это ответили на другие вопросы и ответы здесь .
Ваше правило iptables блокирует внешние эхо-запросы -к вашей системе, но по-прежнему получает эхо-ответы -. Когда вы пингуете google.com, ваша система отправляет эхо-запрос -на google.com (, что разрешено ), а затем google.com отвечает вашей системе эхо-ответами -(, что также разрешено. ).
В текущей ситуации вы можете заблокировать эхо-ответы -, добавив еще одно правило INPUT.
$ sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j DROP
Другой другой подход заключается в том, чтобы заблокировать отправку системой эхо-запросов -и эхо-ответов -с помощью цепочки OUTPUT.
$ sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
$ sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
Три возможных вещи, которые могут играть здесь:
Во-первых, вы отбрасываете пакеты типа "echo-request ", это то, что отправляет ваша программа ping. Ответ, который вы получаете с пульта, — «эхо -ответ», вы его не блокировали.
Некоторые низкоуровневые -способы отправки необработанных пакетов фактически обходят iptables. Я думаю, что помню, по крайней мере, сервер / клиент ISC DHCP, работающий, даже если iptables настроен на отбрасывание пакетов DHCP. (По крайней мере, клиент должен иметь возможность отправлять пакеты с нулевым адресом в качестве источника, поскольку при запуске у него еще нет адреса. )Если я не ошибаюсь, это будетAF_PACKET
(см. packet(7)
), но инструмент ping
в моем Debian не использует это и подчиняется iptables.
В-третьих, поскольку вы использовали -A
для добавления к цепочке INPUT
, перед ней может быть что-то, что делает новое правило неэффективным, в зависимости от того, как настроен ваш iptables.