expressão grep para encontrar um número

expressão grep para encontrar um número

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 é 01ou, 02e atribuí-los a uma variável. Alguém pode me ajudar com um comando adequado.

Responder1

grepcom 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, \Kdescarta 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 grepum, ^[^[: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 resto

  • Na 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 -opara 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

informação relacionada