Gostaria de encontrar um número no nome do host. Normalmente o nome do host dos servidores é algo como abaixo
host01.host.name
host02.host.name
Quero obter os 2 caracteres numéricos antes do primeiro símbolo, .
que é 01
ou, 02
e atribuí-los a uma variável. Alguém pode me ajudar com um comando adequado.
Responder1
grep
com PCRE ( -P
):
grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
^[^\d.]*
corresponde à parte antes dos primeiros dígitos do início, certificando-se também de que não há.
antes dos dígitos,\K
descarta a correspondência\d+
corresponde a um ou mais dígitos(?=\.)
é um padrão lookahead positivo com largura zero, garantindo que haja.
na frente
Como haverá múltiplas saídas, é melhor salvá-las em um array:
output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) )
Agora você pode iterar sobre os elementos do array ou usá-los pelas maneiras usuais de acesso ao array, por exemplo, para obter o valor do n-ésimo elemento use "${output[n]}"
, para obter todos os valores de todas as chaves use "${output[@]}"
.
sed
:
sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
Semelhante a
grep
um,^[^[:digit:].]*
corresponde à parte antes dos primeiros dígitos desde o início, certificando-se também de que não haja.
antes dos dígitos([[:digit:]]+)
corresponde a um ou mais dígitos e os coloca no grupo capturado 1\..*
corresponde a a.
e depois ao restoNa substituição apenas o grupo capturado
\1
é usado
Exemplo:
$ 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
Responder2
$ echo host01.host.name | grep --only-matching '[0-9]*'
01
Ele usa expressões regulares básicas [0-9]*
para correspondência e GNU Grep --only-matching
(ou talvez -o
para outro Grep) para filtrar a saída.
Responder3
echo "host01.host.name host02.host.name" | sed 's/\..*//;s/[^0-9]*//'
ou para você;
hostname | sed 's/\..*//;s/[^0-9]*//'
solução alternativa:
echo "host01.host.name host02.host.name" | grep -o "[0-9]*" | head -1
ou para você;
hostname | grep -o "[0-9]*" | head -1