expresión grep para encontrar un número

expresión grep para encontrar un número

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 01o 02y asignarlos a una variable. ¿Alguien puede ayudarme con el comando adecuado?

Respuesta1

grepcon 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, \Kdescarta 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 grepuno, ^[^[: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 resto

  • En el reemplazo solo \1se 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 -ootros 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

información relacionada