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

Jus*_*hek 1 text-processing

我需要的

我有一个域列表,如下所示:

a.example.com
b.foo.com
a.b.bar.com
Run Code Online (Sandbox Code Playgroud)

我只希望输出能够获取二级域,而不是其他域,即没有三级或更高级别的域。这就是我从上面的示例列表中寻找的内容:

example.com
foo.com
bar.com
Run Code Online (Sandbox Code Playgroud)

我尝试过的

我尝试过使用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

cat domains.txt | cut -d '.' -f[field] # won't work since there are 4th level domains
Run Code Online (Sandbox Code Playgroud)

小智 5

如果您需要从右侧开始匹配,则可以使用结束锚$将图案固定到线的末尾。

格列普:

grep -Po '[^.]+\.[^.]+$' domains.txt
Run Code Online (Sandbox Code Playgroud)

sed:

sed  's/.*\.\([^.]\+\.[^.]\+\)$/\1/' domains.txt
Run Code Online (Sandbox Code Playgroud)

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

awk:

awk -F . -vOFS=. '{print $(NF-1), $NF}' domains.txt
Run Code Online (Sandbox Code Playgroud)

您还可以反转命令的文本,例如:readcut纯粹从左到右读取的命令。

转速、切割:

rev domains.txt | cut -d . -f1,2 | rev
Run Code Online (Sandbox Code Playgroud)

仅 Bash 示例:

while read -r; do \
    printf %s\\n ${REPLY/#${REPLY%.*.*}.}; \
done < domains.txt
Run Code Online (Sandbox Code Playgroud)