하위 도메인 목록에서 기본 도메인을 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 ^: 줄 시작 [^\.]: 제외 점 +: 한 번 이상 \.: 점 [a-zA-Z]{2,3}: 두 개 또는 세 개의 알파벳 문자(예: .com, .co) [a-zA-Z]{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

이는 모듈과 함께 제공되는 기본 목록을 사용하지만 이를 제공할 수도 있습니다.업데이트된 목록필요한 경우 해당 설명서를 따르십시오.

데비안에서는 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:]-]+시작 부분에 고정된 하나 이상의 도메인에 유효한 문자

(전체 그룹을 시작으로 첫 학기는 다음과 같습니다

([.][[:alpha:]]{2})점으로 시작하고 그 뒤에 두 개의 알파벳 문자로 구성된 하위 그룹이 옵니다.

{2}이전 하위 그룹이 정확히 두 번 반복됩니다.

|이전 그룹의 다음 항목을 정의합니다.

[.][[:alpha:]]{3}점으로 시작하고 뒤에 세 개의 알파벳 문자가 오는 그룹 용어입니다.

)$문자열 끝에 고정된 닫기 그룹

관련 정보