我有一些智能脚本,用于检查服务器名称并获取域名。例如,我有服务器名称:example.ru01。我需要获取:example.ru 我的脚本:
#!/bin/bash
hostname=example.com01
echo $hostname
reg0="\(\([a-z0-9_-]*\)\|\([a-z0-9_-]*\.[a-z_-]*\)\)"
domain=`expr match $hostname $reg0`
echo $domain
没关系。输出内容为:
example.com01
example.com
但是,当我写第三级域时,我有输出:
example.com.us01
example.com
因此,我需要另一个正则表达式。我写了这个:
reg0="\(\([a-z0-9_-]*\)\|\([a-z0-9_-]*\.[a-z0-9_-]*\.[a-z_-]*\)\)"
输出:
example.com.us01
example.com.us
它可以工作。但是,当我写入二级域时,我有输出:
example.com01
example
那么...我可以为两种类型的域编写一个正则表达式吗?
答案1
这看起来像一道家庭作业题。
使用带括号的 * 怎么样?
subdomain\.(domain)*
或者,简单地去掉最后几位数字怎么样?
(.*)[0-9][0-9]
您需要更具体一点;您需要验证输入吗?
答案2
我相信您可以使用以下代码解决您的问题:
#!/bin/bash
hostname=test.example.com01 #or example.com01 or foo.test.example.com01
echo $hostname
reg0='^.*\.\([a-z0-9_-]*\.[a-z_-]*\)[0-9]*$'
reg1='^\([a-z0-9_-]*\.[a-z_-]*\)[0-9]*$'
domain=`expr "$hostname" : "$reg0" '|' "$hostname" : "$reg1"`
echo $domain
让我解释一下:
expr STRING:REGEX
将执行与 相同的操作expr match
。|
中间的意思是:如果"$hostname" : "$reg0"
为空,则尝试。正如 coreutils 文档所述,正则表达式隐式以 ^ 开头,并且返回的字符串是和"$hostname" : "$reg1"
里面的字符串。\(
\)
请记住,这*
是贪婪的,并会尽可能地匹配所有内容。
也就是说,程序从匹配所有三级、四级等域的 reg0 开始……但由于第一个点,无法匹配 example.com01。如果$hostname
不是三级域或更多,则$reg0
返回 null,然后是匹配 example.com01 样式域的 reg1。
我已经尝试过该程序并且一切似乎都按照你想要的方式运行。