다음 형식의 도메인 이름이 포함된 대용량 파일이 있습니다.
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}
점으로 시작하고 뒤에 세 개의 알파벳 문자가 오는 그룹 용어입니다.
)$
문자열 끝에 고정된 닫기 그룹