サブドメインのリストからプライマリドメインをgrepする方法

サブドメインのリストからプライマリドメインをgrepする方法

次の形式のドメイン名を含む大容量ファイルがあります。

domain.com
sub.domain.com
sub.domain.co.uk
domain.co.uk

最上位ドメイン(.comなど)または国コードの最上位ドメインを使用して、デフォルトドメイン名(サブドメインを除く)を抽出したいと思います。

最上位ドメイン名は常に2〜3文字です(例:.com、.net、.gov)。

国コードの最上位ドメインは常に2文字(例:.uk、.us)で、対応する行の末尾にあります。

したがって、入力に上記のリストが含まれている場合、出力は次のものを抽出する必要があります。

domain.com
domain.co.uk

私は次のような表現を試してみました。

grep -P '^[^\.]+\.[a-zA-Z]{2,3}\.[a-zA-Z]{2}$

これが私の説明です。-P:perl regex ^:行の始まり[^\.]:除外ポイント+:1回以上\.:ポイント[a-zA-Z]{2,3}:2つまたは3つのアルファベット文字(例:.com、.co)[a-zA-Z]{2}$:行の末尾に2つのアルファベット文字

私の問題:私が得た出力は常に抽出されます。

domain.co.uk

しかし、domain.com

domain.com国コードの最上位ドメイン(たとえば、および)を含むまたは含まない正規表現抽出ドメイン名を作成できますが、サブdomain.co.ukドメイン(たとえば、sub.domain.co.ukまたは)を除外するにはどうすればよいですか。sub.domain.com

ベストアンサー1

最上位のサフィックスが、、、、になることができると思う場合は、うまくいく唯一.usの方法はリスト全体をハードコーディングすることです。.gov.uk.tas.gov.au.uk

あなたはそれを使用することができますDomain::PublicSuffixパールモジュール:

$ perl -MDomain::PublicSuffix -lne '
  BEGIN{$s = Domain::PublicSuffix->new}
  print if $_ eq $s->get_root_domain($_)' < your-file
domain.com
domain.co.uk

これはモジュールに付属のデフォルトのリストを使用しますが、これを提供することもできます。更新されたリスト必要に応じて該当するマニュアルに従ってください。

Debian では、libdomain-publicsuffix-perlこのモジュールはソフトウェアパッケージにあります。

おすすめ記事