grep 表达式查找一个数字

grep 表达式查找一个数字

我想在主机名中查找数字。通常服务器的主机名如下所示

host01.host.name
host02.host.name

我想获取第一个符号 or 之前的 2 个数字字符,.并将0102分配给变量。有人可以帮我提供合适的命令吗?

答案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

相关内容