如何使用sed只从dig输出中获取名称服务器名称?

时间:2009-10-25 05:54:45

标签: regex sed

我在一家提供网站托管和DNS服务的公司工作。我们正在尝试将所有内容迁移到新服务器,并且我们经常在我们的服务器上遇到陈旧的区域文件,因为客户已将其权威服务器更改为其他人。

我正在尝试编写一个脚本来检查whois,ns和SOA信息,以确定域是否仍将我们用作权威服务器。

我正在尝试使用sed来过滤以下内容的输出,以仅显示没有尾随“。”的名称服务器:

dig +noall +answer soa yahoo.com | sed 's/.*SOA\s*//' | sed 's/\.$//'

我搜索过网络,但是大多数sed命令示例都在“行”而不是“单词”上工作。

所需的输出如下:

$ dig +noall +answer soa yahoo.com | sed '<Some SED code here>'
ns1.yahoo.com

任何建议都会有所帮助。

3 个答案:

答案 0 :(得分:3)

我建议使用括号内的子表达式来识别您想要的位,而不是使用删除您不想要的部分,如下所示:

dig +noall +answer soa yahoo.com | sed 's/.*SOA\s*//' | sed 's/^\([^ ]*\). .*/\1/g'

这将搜索以某些非空格字符开头的字符串,后跟一个点,一个空格,然后是该行的其余部分。它只用点前的位(即子表达式#1)替换该模式。

答案 1 :(得分:3)

使用结构化数据时,更容易使用awk

$ dig +noall +answer soa yahoo.com | awk '{sub(/.$/,"",$5);print $5}'
ns1.yahoo.com

答案 2 :(得分:2)

计算一行中的字数:

awk '{ print NF }'

例如:

printf 'foo bar\nbar\nfoo bar zim' | awk '{ print NF }'

打印:

2
1
3