Linux

Sort Host File With Perl

Recently I had to sort more than 100 thousand hosts alphabetically. The tricky part was that these were domains, and I wanted to sort them by top level domain.

The following perl script can do that. Just paste all the host names inside the script file as shown in the example below:

my @hosts = (

  'zzztech.com',
  'www.zzztech.com',
  'zzzzzz.com',
  'www.zzzzzz.com',

);

sort_hosts.pl

use feature qw( say state );
use Domain::PublicSuffix qw( );

sub get_sort_key {
  my ($host) = @_;
  $host =~ s/\.\z//;
  state $dps = Domain::PublicSuffix->new();
  $dps->get_root_domain($host)
  or die "$host: ".$dps->error();

  my @name= split /\./, substr($host, 0, -length($dps->suffix())-1);
  my @suffix = split /\./, $dps->suffix();
return join '.', reverse @suffix, @name;
}

my @hosts = (

  'zzztech.com',
  'www.zzztech.com',
  'zzzzzz.com',
  'www.zzzzzz.com',

);

my @sorted_hosts =
map s/^[^\0]*\0//r,
sort
map get_sort_key($_)."\0".$_,
@hosts;

say for @sorted_hosts;

Execute it with:

perl sort_hosts.pl

The sorted results will be displayed in the tty. To pipe to a new file type:

perl sort_hosts.pl > My_Sorted_Hosts.txt

 

© 2019 Mteam7 Network. All rights reserved.