Me gustaría encontrar un número en el nombre del host. Por lo general, el nombre de host de los servidores es algo como el siguiente
host01.host.name
host02.host.name
Quiero obtener los 2 caracteres numéricos antes del primer símbolo .
que es 01
o 02
y asignarlos a una variable. ¿Alguien puede ayudarme con el comando adecuado?
Respuesta1
grep
con PCRE ( -P
):
grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
^[^\d.]*
coincide con la parte anterior a los primeros dígitos desde el inicio, asegurándose también de que no haya ninguna.
antes de los dígitos,\K
descarta la coincidencia\d+
coincide con uno o más dígitos(?=\.)
es un patrón de anticipación positivo de ancho cero que garantiza que haya.
al frente
Como habrá múltiples resultados, será mejor que los guardes en una matriz:
output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) )
Ahora puede iterar sobre los elementos de la matriz o usarlos mediante las formas habituales de acceso a la matriz, por ejemplo, para obtener el valor del elemento n-ésimo "${output[n]}"
, para obtener todos los valores de todas las claves "${output[@]}"
.
sed
:
sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
Similar a
grep
uno,^[^[:digit:].]*
coincide con la parte anterior a los primeros dígitos desde el inicio, asegurándose también de que no haya ninguna.
antes de los dígitos.([[:digit:]]+)
coincide con uno o más dígitos y los coloca en el grupo capturado 1\..*
coincide con a.
y luego el restoEn el reemplazo solo
\1
se utiliza el grupo capturado
Ejemplo:
$ 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
Respuesta2
$ echo host01.host.name | grep --only-matching '[0-9]*'
01
Utiliza expresiones regulares básicas [0-9]*
para hacer coincidir y GNU Grep --only-matching
(o tal vez -o
otros Grep) para filtrar la salida.
Respuesta3
echo "host01.host.name host02.host.name" | sed 's/\..*//;s/[^0-9]*//'
o para ti;
hostname | sed 's/\..*//;s/[^0-9]*//'
solución alternativa:
echo "host01.host.name host02.host.name" | grep -o "[0-9]*" | head -1
o para ti;
hostname | grep -o "[0-9]*" | head -1