我需要的
我有一个如下的域名列表:
a.example.com
b.foo.com
a.b.bar.com
我只希望输出抓取二级域名,而不抓取其他任何域名,即不抓取三级或更高级别的域名。这是我从上面的示例列表中寻找的内容:
example.com
foo.com
bar.com
我尝试过
我尝试过使用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
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