У нас есть скрипт, который загружает список доменов для блокировки нашего блока squid, но мы продолжаем получать предупреждения, подобные следующим:

2015/03/02 17:08:47| WARNING: You should probably remove '.artnau.com' from the ACL named 'chat_domains'
2015/03/02 17:08:47| WARNING: '.artnau.com' is a subdomain of '.css.artnau.com'
2015/03/02 17:08:47| WARNING: because of this '.css.artnau.com' is ignored to keep splay tree searching predictable
2015/03/02 17:08:47| WARNING: You should probably remove '.artnau.com' from the ACL named 'chat_domains'
2015/03/02 17:08:47| WARNING: '.chatserve.com' is a subdomain of '.eagles.chatserve.com'
2015/03/02 17:08:47| WARNING: because of this '.eagles.chatserve.com' is ignored to keep splay tree searching predictable

Есть ли способ пройти через файл и удалить поддомен из существующих доменов в списке?

Поэтому возьмите первую строку и проверьте, есть ли в тексте другие строки, заканчивающиеся этим текстом, и удалите его?

1 ответ1

1

Вот как бы вы сделали это в Perl:

$ cat a.txt
.artnau.com
.bar.foo.example.org
.chatserve.com
.css.artnau.com
.eagles.chatserve.com
.example.com
.foo.example.org
$ cat a.txt | perl -ne 'BEGIN { my %h; } $h{$_} = ""; END { foreach (keys %h) { $orig = $_; $_ =~ s/^\..*?\./\./; print $orig if not exists $h{$_} } }' | sort > b.txt
$ cat b.txt 
.artnau.com
.chatserve.com
.example.com
.foo.example.org

Однострочный Perl просматривает a.txt и добавляет каждую строку в хеш с именем %h . После добавления каждой строки файла он проходит через каждый ключ в хэше, удаляет первую часть домена (с первого периода до второго периода), и, если полученная строка отсутствует в хэше, печатает ее. Затем выходные данные передаются через sort (вы можете догадаться, что это делает) и сохраняются в b.txt .

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