Я хотел бы найти номер в имени хоста. Обычно имя хоста серверов выглядит примерно так:
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