对从tld开始并向左工作的域名(FQDN)进行sorting

我正在寻找从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.comexample.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 ),不,我试过了。