выражение grep для поиска числа

выражение grep для поиска числа

Я хотел бы найти номер в имени хоста. Обычно имя хоста серверов выглядит примерно так:

host01.host.name
host02.host.name

Я хочу получить 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-го элемента, используйте "${output[n]}", чтобы получить все значения всех ключей используйте "${output[@]}".


sed:

sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
  • Аналогично grepпервому, сопоставляет часть до первых цифр с начала, также проверяя, что перед цифрами ^[^[:digit:].]*нет.

  • ([[:digit:]]+)сопоставляет одну или несколько цифр и помещает их в захваченную группу 1

  • \..*соответствует а ., а затем остальным

  • При замене \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

Связанный контент