3

我有一个从 httpd.conf 文件中提取的域名列表。这些域名的格式如下:

tld.com
cname.tld.com

这些域名中很少有共享 TLD。

我正在尝试为每个域名仅输出 TLD 列表,但似乎无法弄清楚如何操作 STDOUT 以仅显示给定每个字符串的 tld.com。

例如。假设我的清单有:

site1.com
site2.com
mail.site2.com
www.site3.com
site4.com

我需要从这个列表中得到的结果将反映:

网站 1.com网站
2.com网站 2.com 网站
3.com
网站
4.com

关于我如何做到这一点的任何想法?

4

4 回答 4

2

我想到了:

 awk -F"." '{print $(NF-1)"."$NF}' /path/to/listfile
于 2013-01-16T22:23:27.200 回答
1

试试这个

rev <your file> | cut -d "." -f1-2 | rev | sort -u

说明

如果您的文件包含以下几行:

foo.com
bar.foo.com

第一个 rev 将其转换为:

moc.oof
moc.oof.rab

然后只需选择前两个字段并再次反转它。但是,这仅适用于 3 个字符的 tld。它不适用于类似.co.uk.

CCTLD 更新:

#!/usr/local/bin/bash

# Usage ./foo.sh <file with FQDNS>

for i in `cat $1`
do
        j=`echo $i | rev | cut -d "." -f2`;
        if [ $j == "co" ]
        then
                # CCTLDs
                echo $i | rev | cut -d "." -f1-3 | rev >> $1.tmp
        else
                # 3 character TLD
                echo $i | rev | cut -d "." -f1-2 | rev >> $1.tmp
        fi
done
cat $1.tmp | sort -u
rm $1.tmp
于 2013-01-16T22:02:44.710 回答
1

当您尝试在文本中查找模式时,请考虑正则表达式

Wikipedia 页面列出了您将在正则表达式中使用的最常见符号。

现在,TLD 是一系列 ( *) 非点 ( [^.])、一个点 ( \.)、另一个系列非点 ( [^.]*]),然后是行尾 ( $)。正则表达式是:

[^.]*\.[^.]*$

您可以像这样使用它:

$ cat foo
site1.com
site2.com
mail.site2.com
www.site3.com
site4.com
$ grep -o '[^.]*\.[^.]*$' foo
site1.com
site2.com
site2.com
site3.com
site4.com
于 2013-01-16T22:07:40.193 回答
0
echo FQDN | rev | cut -d "." -f1 | rev

或者,即使使用 IP 地址:

getent hosts IP |  rev | cut -d "." -f1 | rev
于 2015-07-31T14:05:22.640 回答