我想在主机名中查找数字。通常服务器的主机名如下所示
host01.host.name
host02.host.name
我想获取第一个符号 or 之前的 2 个数字字符,.
并将01
其02
分配给变量。有人可以帮我提供合适的命令吗?
答案1
grep
与 PCRE ( -P
):
grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
^[^\d.]*
.
匹配从开始的第一个数字之前的部分,同时确保数字之前没有,\K
丢弃匹配\d+
匹配一位或多位数字(?=\.)
是一个零宽度正前瞻模式,确保.
前面有
由于会有多个输出,您最好将它们保存在数组中:
output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) )
现在您可以迭代数组元素或通过通常的数组访问方式使用它们,例如获取第 n 个元素的值 use "${output[n]}"
,获取所有键的所有值 use "${output[@]}"
。
sed
:
sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
与
grep
一个类似,匹配从开始的第一个数字之前的部分,同时确保数字之前^[^[:digit:].]*
没有.
([[:digit:]]+)
匹配一个或多个数字并将它们放入捕获的组 1 中\..*
匹配 a.
,然后匹配其余的在替换中仅
\1
使用捕获的组
例子:
$ cat file.txt
host01.host.name
host02.host.name
$ grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
01
02
$ sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
01
02
答案2
$ echo host01.host.name | grep --only-matching '[0-9]*'
01
它使用基本的正则表达式[0-9]*
进行匹配,并使用 GNU Grep --only-matching
(或者-o
其他 Grep)来过滤输出。
答案3
echo "host01.host.name host02.host.name" | sed 's/\..*//;s/[^0-9]*//'
或为您;
hostname | sed 's/\..*//;s/[^0-9]*//'
替代解决方案:
echo "host01.host.name host02.host.name" | grep -o "[0-9]*" | head -1
或为您;
hostname | grep -o "[0-9]*" | head -1