首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从子域列表中获取grep主域

如何从子域列表中获取grep主域
EN

Unix & Linux用户
提问于 2023-05-09 19:53:53
回答 3查看 92关注 0票数 0

我有一个大文件,其中包含以下形式的域名:

代码语言:javascript
复制
domain.com
sub.domain.com
sub.domain.co.uk
domain.co.uk

我想提取主域名(没有子域名)与顶级域名(如.com)或国家代码顶级域名。

顶级域名总是在2-3个字母之间(例如.com、.net、.gov)。

国家代码的顶级域名总是两个字母(如.uk,.us),并出现在行的末尾。

因此,如果输入中包含上述列表,则输出应该提取:

代码语言:javascript
复制
domain.com
domain.co.uk

我试过这样的表达:

代码语言:javascript
复制
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}$:行尾的两个字母字符

我的问题:我得到的输出总是被摘录出来:

代码语言:javascript
复制
domain.co.uk

但不是domain.com

如何使regex提取带有或不带国家代码的域名,例如domain.comdomain.co.uk,但没有sub.domain.co.uksub.domain.com等子域

EN

回答 3

Unix & Linux用户

发布于 2023-05-09 21:56:04

尝试通过使用?使最后一个国家代码TLD成为可选的,下面是一些这样做的例子。

使用扩展正则表达式

代码语言:javascript
复制
grep -E '^[^.]+\.[a-zA-Z]{2,3}(\.[a-zA-Z]{2})?或perl regexgrep -P '^[^.]+\.[a-zA-Z]{2,3}(?:\.[a-zA-Z]{2})?或perl regexA2

或perl regex

A2

票数 1
EN

Unix & Linux用户

发布于 2023-05-10 06:02:04

如果您认为顶级后缀可以是.us.gov.uk.tas.gov.au.uk,那么唯一有效的方法就是硬编码完整的列表。

您可以使用Domain::PublicSuffix perl模块:

代码语言:javascript
复制
$ 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包中找到该模块。

票数 1
EN

Unix & Linux用户

发布于 2023-05-09 22:17:56

代码语言:javascript
复制
grep -E "^[[:alnum:]-]+(([.][[:alpha:]]{2}){2}|[.][[:alpha:]]{3})$"

启动时锚定的^[[:alnum:]-]+一个或多个域有效字符

(启动总体小组,第一届任期如下

以点开始的([.][[:alpha:]]{2})子组,后面是两个alpha字符

{2}以前的子组精确重复两次

|在over中分隔下一个项

以点开始的[.][[:alpha:]]{3}群项,后面跟着三个α字符

)$关闭组,锚到字符串的末端

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/745427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档