我有一个大文件,其中包含以下形式的域名:
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 正则表达式
^:
行首
^\.:
排除点
+:
一次或多次
\.:
点
[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
你的问题不明确。如果您像您提到的那样定义了仅域项目,则可以使用以下命令查找它们:
grep -P "^.[^.]+\.[a-zA-Z]{3}$|^.[^.]+\.[a-zA-Z]{2}\.[a-zA-Z]{2}$" FileName
grep -P
使用 Perl 正则表达式^.[^.]+
从每个字符开始,除了并且不包含.
尽可能多的字符\.[a-zA-Z]{3}$
.
最后出现 3 个字符|
或者^.[^.]+
像上面一样\.[a-zA-Z]{2}
最后两次出现 2 个字符两次
答案2
考虑到注册商发放 TLD 和 FLD 的方式,这是一个不小的问题,我认为您无法使用简单的正则表达式和 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
.