Adam Davis の正解に加えて、この操作に対する独自のソリューションを投稿したいと思います。
リストは大きなものなので、さまざまなテスト済みソリューションのうちの 3 つがあります...
まず、その方法で TLD リストを準備します。
wget -O - https://publicsuffix.org/list/public_suffix_list.dat |
grep '^[^/]' |
tac > tld-list.txt
注:の前tac
に確実にテストするためにリストを反転します。.co.uk
.uk
splitDom() {
local tld
while read tld;do
[ -z "${1##*.$tld}" ] &&
printf "%s : %s\n" $tld ${1%.$tld} && return
done <tld-list.txt
}
テスト:
splitDom super.duper.domain.co.uk
co.uk : super.duper.domain
splitDom super.duper.domain.com
com : super.duper.domain
フォークを減らす (構文を避けるmyvar=$(function..)
) ために、bash 関数では出力を stdout にダンプする代わりに変数を設定することを好みます。
tlds=($(<tld-list.txt))
splitDom() {
local tld
local -n result=${2:-domsplit}
for tld in ${tlds[@]};do
[ -z "${1##*.$tld}" ] &&
result=($tld ${1%.$tld}) && return
done
}
それで:
splitDom super.duper.domain.co.uk myvar
declare -p myvar
declare -a myvar=([0]="co.uk" [1]="super.duper.domain")
splitDom super.duper.domain.com
declare -p domsplit
declare -a domsplit=([0]="com" [1]="super.duper.domain")
より速いbashバージョン:
同じ準備で、次のようになります。
declare -A TLDS='()'
while read tld ;do
if [ "${tld##*.}" = "$tld" ];then
TLDS[${tld##*.}]+="$tld"
else
TLDS[${tld##*.}]+="$tld|"
fi
done <tld-list.txt
このステップはかなり遅くなりますが、splitDom
関数は非常に速くなります:
shopt -s extglob
splitDom() {
local domsub=${1%%.*(${TLDS[${1##*.}]%\|})}
local -n result=${2:-domsplit}
result=(${1#$domsub.} $domsub)
}
私のラズベリーパイでのテスト:
両方のbashスクリプトを次のようにテストしました。
for dom in dom.sub.example.{,{co,adm,com}.}{com,ac,de,uk};do
splitDom $dom myvar
printf "%-40s %-12s %s\n" $dom ${myvar[@]}
done
posix版は詳細な for
ループでテストしましたが、
すべてのテスト スクリプトは同じ出力を生成します。
dom.sub.example.com com dom.sub.example
dom.sub.example.ac ac dom.sub.example
dom.sub.example.de de dom.sub.example
dom.sub.example.uk uk dom.sub.example
dom.sub.example.co.com co.com dom.sub.example
dom.sub.example.co.ac ac dom.sub.example.co
dom.sub.example.co.de de dom.sub.example.co
dom.sub.example.co.uk co.uk dom.sub.example
dom.sub.example.adm.com com dom.sub.example.adm
dom.sub.example.adm.ac ac dom.sub.example.adm
dom.sub.example.adm.de de dom.sub.example.adm
dom.sub.example.adm.uk uk dom.sub.example.adm
dom.sub.example.com.com com dom.sub.example.com
dom.sub.example.com.ac com.ac dom.sub.example
dom.sub.example.com.de com.de dom.sub.example
dom.sub.example.com.uk uk dom.sub.example.com
ファイルの読み取りとsplitDom
ループを含む完全なスクリプトは、posix バージョンで ~2m、配列に基づく最初の bash スクリプトでは ~1m29s かかります$tlds
が、連想配列~22s
に基づく最後の bash スクリプトでは ~1m29s かかります。$TLDS
Posix version $tldS (array) $TLDS (associative array)
File read : 0.04164 0.55507 18.65262
Split loop : 114.34360 88.33438 3.38366
Total : 114.34360 88.88945 22.03628
したがって、連想配列の作成がより強力な仕事である場合、splitDom
関数ははるかに高速になります!