我正在嘗試從 cut 命令從右到左獲取最后 2 個值
我有一個包含大約 1.1 億個域和子域的大型資料庫。
喜歡
yahoo.com
mail.yahoo.com
a.yahoo.com
a.yahoo.co.uk
簡而言之,我試圖從域中洗掉子域
echo a.yahoo.aa | cut -d '.' -f 2,3
yahoo.aa
但是當我嘗試
echo yahoo.aa | cut -d '.' -f 2,3
aa
它只給我 aa
所需的輸出是
yahoo.com
yahoo.com
yahoo.com
yahoo.co.uk
編輯感謝 anubhava 的建議。
TLD 屬性就像
xxxx.xx
xxx.xx
xx.xx
即 ccTLD 最后總是有 2 個字符。
uj5u.com熱心網友回復:
長期的解決方案,但一個想法,使你想做的事:
可執行檔案domain.awk:
#! /usr/bin/awk -f
BEGIN {
FS="."
}
{
ret = $NF
if (NF >= 2 && (length($(NF - 1)) == 2 || length($(NF - 1)) == 3)) {
ret = $(NF - 1) "." ret
if (NF >= 3) {
ret = $(NF - 2) "." ret
}
} else if (NF >= 2) {
ret = $(NF - 1) "." ret
}
print ret
}
帶domains.lst檔案:
yahoo.com
mail.yahoo.com
a.yahoo.com
a.yahoo.co.uk
aus.co.au
像這樣使用:
./domain.awk domains.lst
輸出:
yahoo.com
yahoo.com
yahoo.com
yahoo.co.uk
aus.co.au
uj5u.com熱心網友回復:
使用您提供的示例輸入并接受您的宣告a ccTLD always has 2 characters in last.作為列印輸入的最后 3 段而不是最后 2 段的標準:
將 GNU grep 用于-o:
$ grep -Eo '[^.] \.[^.] (\.[^.]{2})?$' file
yahoo.com
yahoo.com
yahoo.com
yahoo.co.uk
或使用任何 awk:
$ awk 'match($0,/[^.] \.[^.] (\.[^.]{2})?$/){print substr($0,RSTART)}' file
yahoo.com
yahoo.com
yahoo.com
yahoo.co.uk
uj5u.com熱心網友回復:
嘗試
echo a.yahoo.aa | awk -F'.' '{print $NF"."$(NF-1)}'
uj5u.com熱心網友回復:
大約 1.1 億個域和子域的大型資料庫。
因此,我建議sed在這里使用,讓file.txt內容成為
yahoo.com
mail.yahoo.com
a.yahoo.com
然后
sed 's/^.*\.\([^.]*\.[^.]*\)$/\1/' file.txt
輸出
yahoo.com
yahoo.com
yahoo.com
^說明:在跨越整行( -start, -end)的正則運算式中,$我使用單個捕獲組,其中包含零個或多個(*)非點,后跟文字點(\.),后跟零個或多個非點,即與行尾相鄰,我將整行替換為該組的內容。免責宣告:此解決方案假定每行中始終至少有一個點
(在 GNU sed 4.2.2 中測驗)
uj5u.com熱心網友回復:
您只選擇欄位 2 和 3。您需要從欄位 2 中選擇直到最后:
... | cut -d '.' -f 2-
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496512.html
