如何从子域名列表中仅抓取二级域名

如何从子域名列表中仅抓取二级域名

我需要的

我有一个如下的域名列表:

a.example.com
b.foo.com
a.b.bar.com

我只希望输出抓取二级域名,而不抓取其他任何域名,即不抓取三级或更高级别的域名。这是我从上面的示例列表中寻找的内容:

example.com
foo.com
bar.com

我尝试过

我尝试过使用sedawk和,cut如下所示:

sed

cat domains.txt | sed 's/\.$//g'
cat domains.txt | sed -r 's/^(.*)_/\1\\/; s/.$//g'  # this removes the last character for some reason

awk

awk '{ sub(/\.$/, ""); print $NF }' domains.txt
cat domains.txt | awk -F\. '{print $1,$2}' | tr ' ' '.' # won't work since there are 4th level domains

cat domains.txt | cut -d '.' -f[field] # won't work since there are 4th level domains

答案1

如果您需要从右侧开始匹配,则可以使用结束锚点$将模式固定到行尾。

grep:

grep -Po '[^.]+\.[^.]+$' domains.txt

sed:

sed  's/.*\.\([^.]\+\.[^.]\+\)$/\1/' domains.txt

awk有一个名为的预定义变量,NF用于保存当前记录的字段数。您可以将NF变量与字段说明符组合起来$以引用该值。

awk:

awk -F . -vOFS=. '{print $(NF-1), $NF}' domains.txt

您还可以反转以下命令的文本:read或者cut纯粹从左到右阅读。

转,切:

rev domains.txt | cut -d . -f1,2 | rev

仅限 Bash 的示例:

while read -r; do \
    printf %s\\n ${REPLY/#${REPLY%.*.*}.}; \
done < domains.txt

相关内容