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 正則表達式^:
行 首^\.:
排除點+:
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.uk
或sub.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_tld
和get_fld
function。第二個將列印您正在尋找的第一級域。例子
$ 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
.參考