我正在寻找从TLD开始并向上工作的域名列表(网页filter白名单)。 我正在寻找任何* nix或Windows工具,可以很容易地做到这一点,虽然脚本也可以。
所以如果是你给的名单
www.activityvillage.co.uk ajax.googleapis.com akhet.co.uk alchemy.l8r.pl au.af.mil bbc.co.uk bensguide.gpo.gov chrome.angrybirds.com cms.hss.gov crl.godaddy.com digitalhistory.uh.edu digital.library.okstate.edu digital.olivesoftware.com
这是我想要的输出。
chrome.angrybirds.com crl.godaddy.com ajax.googleapis.com digital.olivesoftware.com digital.library.okstate.edu digitalhistory.uh.edu bensguide.gpo.gov cms.hss.gov au.af.mil alchemy.l8r.pl www.activityvillage.co.uk akhet.co.uk bbc.co.uk
以防万一你想知道为什么,Squidguard有一个错误/devise缺陷。 如果www.example.com和example.com都包含在列表中,则example.com条目将被忽略,您只能访问www.example.com内容。 我有几个大清单,需要一些清理,因为有人不先查看添加条目。
这个简单的python脚本将做你想要的。 在这个例子中,我将文件命名为domain-sort.py :
#!/usr/bin/env python from fileinput import input for y in sorted([x.strip().split('.')[::-1] for x in input()]): print '.'.join(y[::-1])
运行它使用:
cat file.txt | ./domain-sort.py
请注意,这看起来有点丑陋,因为我把它写成更多或更less的简单的一行,我不得不使用[::-1]切片符号,其中负值用于以相反顺序制作相同列表的副本使用更多的声明性的reverse() ,它是以一种破坏可组合性的方式进行的。
这里有一个稍微长一点的,但也许更可读的版本,它使用了reversed() ,它返回一个迭代器,因此也需要将它包装在list()以消耗迭代器并生成一个列表:
#!/usr/bin/env python from fileinput import input for y in sorted([list(reversed(x.strip().split('.'))) for x in input()]): print '.'.join(list(reversed(y)))
在具有1,500个随机sorting行的文件上,需要大约0.02秒的时间:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02 Maximum resident set size (kbytes): 21632
在一个包含15万个随机sorting行的文件上,需要3秒多一点的时间:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.20 Maximum resident set size (kbytes): 180128
这是一个可以更好读取的版本,可以在原地执行reverse()和sort() ,但是运行时间相同,实际上只占用更多的内存。
#!/usr/bin/env python from fileinput import input data = [] for x in input(): d = x.strip().split('.') d.reverse() data.append(d) data.sort() for y in data: y.reverse() print '.'.join(y)
在具有1,500个随机sorting行的文件上,需要大约0.02秒的时间:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02 Maximum resident set size (kbytes): 22096
在一个包含15万个随机sorting行的文件上,需要3秒多一点的时间:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.08 Maximum resident set size (kbytes): 219152
这是一个PowerShell脚本,应该可以做你想做的事情。 基本上,它将所有顶级域名(TLD)引入到一个数组中,将每个顶级域名(TLD)进行sorting,对其进行sorting,将其反转回原始顺序,然后将其保存到另一个文件中。
$TLDs = Get-Content .\TLDsToSort-In.txt $TLDStrings = @(); foreach ($TLD in $TLDs){ $split = $TLD.split(".") [array]::Reverse($split) $TLDStrings += ,$split } $TLDStrings = $TLDStrings|Sort-Object foreach ($TLD in $TLDStrings){[array]::Reverse($TLD)} $TLDStrings | %{[string]::join('.', $_)} | Out-File .\TLDsToSort-Out.txt
logging在1500条logging上 – 在function强大的桌面上花费5秒钟。
Perl稍微less一些,或者至less比较漂亮一些:
use warnings; use strict; my @lines = <>; chomp @lines; @lines = map { join ".", reverse split /\./ } sort map { join ".", reverse split /\./ } @lines; print "$_\n" for @lines;
这是Guttman-Rosler变换的一个简单例子:我们将这些行转换成适当的可sortingforms(这里,按照句点拆分域名并颠倒部分的顺序),使用本地词典sorting,然后将其转换回到原来的forms。
在Unix脚本中:反向,sorting和反向:
awk -F "." '{for(i=NF; i > 1; i--) printf "%s.", $i; print $1}' file | sort | awk -F "." '{for(i=NF; i > 1; i--) printf "%s.", $i; print $1}'
在这里(简短而神秘)perl:
#!/usr/bin/perl -w @d = <>; chomp @d; for (@d) { $rd{$_} = [ reverse split /\./ ] } for $d (sort { for $i (0..$#{$rd{$a}}) { $i > $#{$rd{$b}} and return 1; $rd{$a}[$i] cmp $rd{$b}[$i] or next; return $rd{$a}[$i] cmp $rd{$b}[$i]; } } @d) { print "$d\n" }
cat domain.txt | rev | sorting| 转
awk -F"." 's="";{for(i=NF;i>0;i--) {if (i<NF) s=s "." $i; else s=$i}; print s}' <<<filename>>> | sort | awk -F"." 's="";{for(i=NF;i>0;i--) {if (i<NF) s=s "." $i; else s=$i}; print s}'
这样做是为了反转域名中的每个字段,然后sorting并反向回溯。
这确实按域名列出,按字母顺序依据域名的每个部分,从右到左sorting。
反向解决scheme( rev <<<filename>>> | sort | rev ),不,我试过了。