expressão grep para encontrar um número

1

Eu 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

Eu quero obter os 2 caracteres numéricos antes do primeiro símbolo . , que é 01 ou 02 , e atribuí-lo a uma variável. Alguém pode me ajudar com o comando adequado.

    
por linux_bee 28.10.2016 / 22:43

3 respostas

2

grep com PCRE ( -P ):

grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
  • ^[^\d.]* corresponde à parte antes dos primeiros dígitos do início, garantindo também 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á várias saídas, é melhor salvá-las em uma matriz:

output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) )

Agora, você pode iterar os elementos da matriz ou usá-los pelas formas usuais de acesso à matriz. 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:]]+)\..*//' file.txt
  • Semelhante a grep one, ^[^[:digit:].]* corresponde à parte antes dos primeiros dígitos do início, garantindo também 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 . e depois ao restante

  • Na substituição apenas o grupo capturado é 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:]]+)\..*//' file.txt
01
02
    
por 28.10.2016 / 22:46
1
$ echo host01.host.name | grep --only-matching '[0-9]*'
01

Ele usa a expressão regular básica [0-9]* para correspondência e --only-matching do GNU Grep (ou talvez -o para outro Grep) para filtrar a saída.

    
por 28.10.2016 / 23:06
0
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
    
por 28.10.2016 / 22:50