Que expressão regular posso usar para corresponder a um endereço IP?

35

Com a seguinte sintaxe grep , quero corresponder todos os endereços IP em um arquivo (de um script ksh )

  grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file

O problema: ele também corresponde a palavras (IP) com mais de 4 octetos:

1.1.1.1.1 

ou

192.1.1.1.160

Como posso combinar um endereço IP válido e somente IP com 4 octetos? Eu também posso usar o Perl - uma solução de sintaxe de uma linha, se grep não funcionar.

    
por jennifer 24.10.2010 / 14:00

12 respostas

56

tente isto:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

que corresponde a todas as expressões de 0.0.0.0 a 999.999.999.999

com

grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

você receberá apenas endereços IP

nota:
na solaris provavelmente egrep fará o trabalho.

    
por 24.10.2010 / 15:01
10

Como é isso:

perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts
    
por 24.10.2010 / 15:50
5

O

-w / --word-regexp 
O sinalizador

para grep faz com que ele corresponda apenas a limites de palavras, o que significa que sua correspondência deve estar entre espaços em branco ou começar / terminar no início / fim da linha!

    
por 26.06.2012 / 13:15
5

Para encontrar apenas correspondências com 4 octetos exatamente (excluindo itens como 1.1.1.1.1) use este:

grep -P '(?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)'

Nunca deve detectar endereços não-IP. A expressão pode ser mais complexa para verificar mais coisas, mas isso deve funcionar na maioria dos casos. Ele não corresponderá a um 0 anterior, já que 010.1.12.1 não é uma maneira comum de gravar endereços IP.

    
por 13.09.2012 / 10:35
5
if [ ' echo $ip | '^((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)$'  | grep -o "\." | wc -l' -eq 1 ];
then ipv4=true;
else 
ipv4=false;
    
por 13.09.2012 / 10:12
3

Um pouco complicado, mas deve funcionar:

( X='\([0-9]\{1,2\}\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)' ; grep "\([^\.]\|^\)$X\.$X\.$X\.$X\([^\.]\|$\)" file )
    
por 24.10.2010 / 17:14
0

grep -E '^((25[0-5]|2[0-4][0-9]|[1]?[1-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[1]?[1-9]?[0-9])$'

Versão modificada da resposta de Arnaud B.

Esta expressão não corresponderá a endereços IP com 0s iniciais. por exemplo, não corresponderá a 192.168.1.01 Esta expressão não corresponderá aos endereços IP com mais de 4 octetos. por exemplo, não corresponderá a 192.168.1.2.3

    
por 02.09.2013 / 07:56
0

Estou usando egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts para corresponder aos endereços IP no início de uma linha. Ele também pode ser usado sem o ^ para permitir espaços em branco ou outros caracteres antes do endereço IP.

[0-9]{1,3} --> this matches a number between 1 and 999.
\. --> this is to add the dot.
([0-9]{1,3}\.){3} --> get a number with a dot 3 times.
[0-9]{1,3} --> finally add the fourth number.
    
por 29.10.2015 / 19:58
0

Uma versão mais curta do regex longo:

egrep '([1-2]?[0-9]{0,2}\.){3,3}[1-2]?[0-9]{0,2}' 

Por favor, use grep -E ou egrep conforme adequado à sua versão do SO

    
por 17.11.2015 / 10:56
0

grep -Eo '([0-9] {1,3}.)) {4}'

Exemplo: curl link | grep "IP visível depuis mon serveur" | grep -Eo '([0-9] {1,3}.)) {4}'

    
por 01.09.2016 / 11:46
0

Expressão regular para correspondência de um endereço IP no TCL

set a "192.168.10.25"

if {[regexp
{^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$} $a]} 
{
    puts "yes"
}
    
por 17.04.2015 / 13:17
-1

Aqui está o que funcionou para mim para o ksh e o ksh93 no AIX:

ip =

[[$ ip == [0-9] @ ("" | [0-9]) @ ("" | [0-9]). [0-9] @ ("" | [0- 9]) @ ("" | [0-9]). [0-9] @ ("" | [0-9]) @ ("" | [0-9]). [0-9] @ ( "" | [0-9]) @ ("" | [0-9])]] & & eco OK || eco NOK O acima pode ser modificado para "filtrar" o IP fornecido para qualquer padrão desejado.

    
por 15.02.2017 / 11:02