Grep

grep 從文件中提取包含完整域名的行

  • July 29, 2018

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

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 正則表達式 ^:行 首^\.:排除點 +:1 次或多次 \.:[a-zA-Z]{2,3}:2 或 3 個字母字元(例如 .com、.co) [a-zA-Z]{2}$:行尾的兩個字母字元

我的問題:我得到的輸出總是提取:

domain.co.uk

但不是domain.com

如何使我的正則表達式提取帶有或不帶國家程式碼頂級域名的域名,例如domain.com和,domain.co.uk但沒有子域,例如sub.domain.co.uksub.domain.com

你的問題模棱兩可。如果您對域唯一項目的定義像您提到的那樣,要找到它們,您可以使用:

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 個字元

考慮到 TLD 和 FLD 被註冊商處理的方式,這是一個重要的問題,我認為您無法使用簡單的正則表達式和 CLI 工具來解決。

我會依靠類似這個Python 模組的東西,tld . 該模組同時具有 aget_tldget_fldfunction。第二個將列印您正在尋找的第一級域。

例子

$ 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