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

Regex 如何使用sed从dig输出中仅获取名称服务器名称?,regex,sed,Regex,Sed,我在一家提供网络主机和DNS服务的公司工作。我们正在尝试将所有内容迁移到新服务器上,由于客户将其权威服务器更改为其他服务器,我们的服务器上经常会遇到过时的分区文件 我正在尝试编写一个脚本,该脚本将检查whois、ns和SOA信息,以确定某个域是否仍将我们用作权威服务器 我正在尝试使用sed筛选以下内容的输出,以仅显示名称服务器,而不显示尾随内容: dig +noall +answer soa yahoo.com | sed 's/.*SOA\s*//' | sed 's/\.$//' 我已经在

我在一家提供网络主机和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

任何建议都会有帮助。

要计算一行中的字数:

awk '{ print NF }'
例如:

printf 'foo bar\nbar\nfoo bar zim' | awk '{ print NF }'
印刷品:

2
1
3

要计算一行中的字数,请执行以下操作:

awk '{ print NF }'
例如:

printf 'foo bar\nbar\nfoo bar zim' | awk '{ print NF }'
印刷品:

2
1
3

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

$ dig +noall +answer soa yahoo.com | sed '<Some SED code here>'
ns1.yahoo.com
dig+noall+answer soa yahoo.com | sed's/*soa\s*/'| sed's/^\[^]*\*/\1/g'


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

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

$ dig +noall +answer soa yahoo.com | sed '<Some SED code here>'
ns1.yahoo.com
dig+noall+answer soa yahoo.com | sed's/*soa\s*/'| sed's/^\[^]*\*/\1/g'


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

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

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

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

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

哇,我已经为这个绞尽脑汁好几个小时了。谢谢你的提示。有推荐的参考资料吗?刚开始使用SED,到目前为止还没有找到很多好的文档。说实话,我自己只接触了SED冰山的一角——只是搜索和替换的s命令——但我一直在使用它。我给您的命令显示了一个我经常使用的常见模式:将字符匹配到某个分隔符。这可以通过使用“^”字符从范围中排除分隔符来实现,例如,当分隔符是空格时,.[^]*。另一个有用的功能是子表达式,在sed中它们有点痛苦,因为括号需要转义,因此上面的\…\是。哦,我发现了一个引用,里面似乎有一些好东西:为什么括号需要转义?@Ollie:默认情况下,sed使用基本正则表达式,其中括号和许多其他有用的RE字符除非转义,否则没有任何特殊意义。您可能更习惯于扩展正则表达式,其中转义这些字符将关闭它们的特殊函数。有关更多详细信息,请阅读man re_格式。如果你指定-E标志,一些版本的sed可以使用扩展REs。哇,我已经为这个绞尽脑汁好几个小时了。谢谢你的提示。有推荐的参考资料吗?刚开始使用SED,到目前为止还没有找到很多好的文档。说实话,我自己只接触了SED冰山的一角——只是搜索和替换的s命令——但我一直在使用它。我给您的命令显示了一个我经常使用的常见模式:将字符匹配到某个分隔符。这可以通过使用“^”字符从范围中排除分隔符来实现,例如,当分隔符是空格时,.[^]*。另一个有用的功能是子表达式,在sed中它们有点痛苦,因为括号需要转义,因此上面的\…\是。哦,我发现了一个引用,里面似乎有一些好东西:为什么括号需要转义?@Ollie:默认情况下,sed使用基本正则表达式,其中括号和许多其他有用的RE字符除非转义,否则没有任何特殊意义。您可能更习惯于扩展正则表达式,其中转义这些字符将关闭它们的特殊函数。有关更多详细信息,请阅读man re_格式。如果指定-E标志,某些版本的sed可以使用扩展REs。