我有一个大文件,其中包含以下形式的域名:
domain.com
sub.domain.com
sub.domain.co.uk
domain.co.uk我想提取主域名(没有子域名)与顶级域名(如.com)或国家代码顶级域名。
顶级域名总是在2-3个字母之间(例如.com、.net、.gov)。
国家代码的顶级域名总是两个字母(如.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}: 2或3个字母字符(例如,.com,.co)在行尾的两个字母字符
我的问题:我得到的输出总是被摘录出来:
domain.co.uk但不是domain.com
如何使regex提取带有或不带国家代码的域名,例如domain.com和domain.co.uk,但没有sub.domain.co.uk或sub.domain.com等子域
发布于 2018-07-29 06:22:25
你的问题模棱两可。如果像您提到的仅域项的定义一样,要找到它们,可以使用:
grep -P "^.[^.]+\.[a-zA-Z]{3}$|^.[^.]+\.[a-zA-Z]{2}\.[a-zA-Z]{2}$" FileNamegrep -P使用Perl regex^.[^.]+从每一个字符开始,除了并且不包含.。\.[a-zA-Z]{3}$发生了.,最后有3个字符| OR^.[^.]+\.[a-zA-Z]{2}发生了两次二次故障。发布于 2018-07-29 06:13:24
考虑到TLDs和FLDs由注册人员分发的方式,这是一个不平凡的问题,我认为您将无法使用简单的regexes和CLI工具来解决。
我会依赖像Python模块tld这样的东西。该模块同时具有get_tld和get_fld功能。第二个将打印一级域名,这是您正在寻找的。
$ cat fld.py
#!/bin/python
from tld import get_fld
fldList = []
domList = open("domlist.txt").read().splitlines()
for dom in domList:
fldList.append(get_fld(dom, fix_protocol=True))
print("\n".join(sorted(set(fldList))))样本运行:
$ ./gtld.py
domain.co.uk
domain.com注意:域列表位于一个名为domlist.txt的文件中。
https://unix.stackexchange.com/questions/459127
复制相似问题