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 正则表达式 ^:行首 ^\.:排除点 +:一次或多次 \.:[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_tldget_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.

参考

相关内容