como combinar tudo entre uma string e antes do próximo espaço

4

digamos que eu tenha a seguinte string:

sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret 

Eu gostaria de extrair "192.168.1.1" ou qualquer outro endereço IP válido (quatro números decimais, cada um variando de 0 a 255, separados por pontos, por exemplo, 172.16.254.1)

Parece que a maneira mais fácil de fazer isso é combinar tudo entre a string "-ip" e antes do próximo espaço seguinte (o espaço entre 192.168.1.1 e sdfdf).

Eu tentei:

sed -e 's/-s \(.*\)[[:space:]]//'

mas não funcionou

    
por tim 06.12.2016 / 22:49

4 respostas

2

A partir de agora, sua pergunta é "Como eu extraio da string '-ip' para o próximo espaço?". Seguindo os comandos, responda isso.

sed -e 's/^.*-ip \([^ ]*\) .*$//'

Funciona basicamente dizendo "qualquer quantidade de caracteres não espaciais": [^ ]*

$ echo "sdf sfdi -ip 192.168.1.1 sdf eret" | sed -e 's/^.*-ip \([^ ]*\) .*$//' 192.168.1.1

    
por 06.12.2016 / 22:54
2

Assumindo o GNU grep :

$ echo 'sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret' | grep -oE '[0-9.]+'
192.168.1.1

E para limitar isso apenas a endereços IP válidos, então seqüências com 4 conjuntos de dígitos separados por . e nenhum deles acima de 255 (não estou lidando com <0 , pois o - não foram correspondidos em primeiro lugar):

$ echo 'sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret' | grep -oE '[0-9.]+' | 
    awk -F. '{for(i=1;i<=NF;i++){if(NF!=4||$i>255){next}}}1;'
192.168.1.1
    
por 06.12.2016 / 23:39
1

Com o GNU grep:

echo 'sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret' | grep -oE "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

Saída:

192.168.1.1
    
por 06.12.2016 / 22:56
1

Esqueça sed . É assim que você extrai prováveis endereços IP (v4):

egrep -o '\b([0-9][0-9]?[0-9]?\.){3}[0-9][0-9]?[0-9]?\b'

Para obter endereços IP absolutamente válidos (ou seja, sem números acima de 255), envie o comando acima para:

egrep -v '([3-9][0-9][0-9]|2[6-9][0-9]|25[6-9])'
    
por 06.12.2016 / 22:56