我有一个域列表,如下所示:
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)
我尝试过使用sed、awk和 ,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)
您还可以反转命令的文本,例如:read或cut纯粹从左到右读取的命令。
转速、切割:
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)