我们有一个脚本,可以下载我们的 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
使用 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
。