サブドメインのリストからプライマリドメインを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このモジュールはソフトウェアパッケージにあります。

答え2

?最後の国コードTLDをオプションにするには、次の例を試してください。

拡張正規表現の使用

grep -E '^[^.]+\.[a-zA-Z]{2,3}(\.[a-zA-Z]{2})?$'

またはPerl正規表現

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

答え3

grep -E "^[[:alnum:]-]+(([.][[:alpha:]]{2}){2}|[.][[:alpha:]]{3})$"

^[[:alnum:]-]+先頭に固定された1つ以上のドメインに有効な文字

(グループ全体を始め、最初の学期は次のとおりです。

([.][[:alpha:]]{2})ドットで始まり、その後に2つのアルファベット文字で構成されるサブグループが続きます。

{2}前のサブグループは正確に2回繰り返されます。

|前のグループの次の項目を定義します。

[.][[:alpha:]]{3}ドットで始まり、後に3つのアルファベット文字が続くグループ用語です。

)$文字列の末尾に固定された閉じるグループ

関連情報