我有一些智能脚本,它检查服务器的名称并获取域名。例如,我有服务器的名称:example.ru01。我需要得到:example.ru我的scipt:
#!/bin/bash
hostname=example.com01
echo $hostname
reg0="\(\(\w*\.[a-z]*\)\|\(\w*\.[a-z]*\.[a-z]*\)\)"
domain=`expr match $hostname $reg0`
echo $domain
没关系。在输出中我有:
example.com01
example.com
但是,在我的基础架构中,我有一些带有连字符的域名。例如:test-test.com01。但它并没有在我的脚本中工作。如何解决这个问题?请帮忙。我在正则表达式中做了一些更改,如下所示:
\(\(\w*\.[a-z_-]*\)\|\(\w*\.[a-z_-]*\.[a-z_-]*\)\)
但它不起作用。哪里有错误?请帮忙。谢谢你的关注。
答案 0 :(得分:1)
是的,test-test.com01
将不匹配。
但是,www.test-test.com01
会:
$ hostname="www.test-test.com01"
$ reg0="\(\(\w*\.[a-z_-]*\)\|\(\w*\.[a-z_-]*\.[a-z_-]*\)\)"
$ expr match $hostname $reg0
www.test-test.com
问题是您需要一个可选的w
(零次或多次)和一个点\.
。
嗯,实际上,你写的是“一个单词”\w
,在这种情况下,你应该删除反斜杠,如果你想要匹配的是“www”。
此外,域名中的下划线不正确。这是你应该使用的正确的正则表达式:
reg0="\(\(w\{1,3\}\.\)\?[a-z-]\+\(\.[a-z-]*\)\?\)"
在这一个中,www.
可选地匹配,然后是一个或(可选)两个名称,中间有一个点。
但是,域名可以包含数字:www.1and1.com
事实上,小心!!现在它们可以包含任何有效的UTF-8字符串:
来自RFC 6531的第3.3节:
的第2.3.2.1节扩展的定义允许RFC 5321定义和符合DNS标签的UTF-8字符串 与IDNA定义[RFC5890]。
“U-label”是一个IDNA有效的Unicode字符串,在 归一化形式C(NFC)并且包括至少一个非ASCII 字符,以标准Unicode编码格式表示(例如 UTF-8)。
答案 1 :(得分:0)
您走在正确的轨道上,您遇到的一个小问题是您将-
添加到负责匹配域的最后部分的正则表达部分,例如.com
,{ {1}}或.net
。相反,您应该将.ru
添加到正则表达式的第一部分。这应该有效:
-
可以使用此令牌req0="\(\(\[a-z0-9_-]*\.[a-z]*\)\|\([a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]*\)\)"
缩短此正则表达式[a-z0-9_]
,并且它可以正常运行。但是,此标记\w
似乎无法在bash中的\w
内运行,因此,我使用[]
来添加[a-z0-9_]
。