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


35

Com a seguinte grepsintaxe, quero corresponder a todos os endereços IP em um arquivo (de um kshscript)

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

O problema: 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 IP válido e apenas endereços IP com 4 octetos? Também posso usar o Perl - uma solução de sintaxe de uma linha, se grepnão funcionar.


4
Combina 999.999.999.999também.
CYrus

4
Então, você deseja apenas grep endereços IPv4, certo ?
Arjan #

5
Tecnicamente, endereços IP 192.1.4097válidos e aceitos pelo Linux glibc e Windows.
grawity

1
Ah, eu nunca soube ! ping 2130706433, No OS X: PING 2130706433 (127.0.0.1): 56 data bytes.
Arjan

1
@Arjan: 0x7f.1and0177.1
grawity

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.0a999.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:
no solaris provavelmente o egrep fará o trabalho.


Eu tento o grep '\ b \ d {1,3} \. \ D {1,3} \. \ D {1,3} \. \ D {1,3} \ b' / etc / hosts, mas eu não receba nada - :(
jennifer

1
@jennifer, você precisará habilitar expressões regulares estendidas: grep -E <pattern> <file>(ou, para imprimir as correspondências:grep -Eo <pattern> <file>
Arjan 24/10

como isso ? grep -E '\ b \ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} \ b' / etc / hosts
jennifer

3
@udo: Bem, isso corresponde, 1.1.1.1.1mas oculta o último .1resultado, não consigo ver como isso pode ajudar.
CYrus

1
Seu regexp não corresponde a 10.0.0.1
Stefan Seidel

10

Como é isso:

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

Agradável! (Isso também retorna 192.1.1.1.160como 192.1.1.1, o que eu acho que é bom para o consulente pergunta.)
Arjan

2
Se realmente quiser endereços IP conformes, este é o único tipo de solução que tem chances de estar perto de ser concluída. Quando vi a pergunta, pensei: "Não tocarei nisso com uma vara de regexp padrão de três metros". Advertências, advertências em todos os lugares :-).
Daniel Andersson

5

o

-w / --word-regexp 

sinalize para grepque ele corresponda apenas aos limites das palavras, o que significa que sua correspondência deve estar entre espaços em branco ou iniciar / terminar no início / final da linha!


5

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

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

Ele 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, pois 010.1.12.1 não é uma maneira comum de escrever endereços IP.


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;

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 )

E 127.000.000.001então? ;-)
Arjan

Tanto quanto eu sei IPs não tem zeros de preenchimento.
Cyrus

1
Hmmm, ping 127.000.000.001certamente funciona no meu Mac. Mas então: acabei de aprender que até ping 2130706433produz o mesmo resultado. :-) Opa, ping 00127.00000.00000.00001traduz para 87.0.0.1. Estranho ... Ou octal talvez? Sim, octal, com certeza, então você está certo sobre zeros à esquerda, eu acho.
Arjan

Sim, 00127 (octal) = 87 (decimal). Certamente todos são IPs válidos, mas acho que essa não é a maneira padrão de representá-los. De qualquer forma, isso não é solicitado pelo solicitante.
Cyrus

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.

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


Isso também não corresponde a 127.0.0.1.
Chris Charabaruk

0

Estou usando egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts para combinar endereços IP no início de uma linha. 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.

0

Uma versão mais curta do regex longo:

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

Use grep -E ou egrep conforme adequado à sua versão do sistema operacional


2
bem-vindo ao superusuário. Esta pergunta já tem várias boas respostas. Para ajudar as pessoas a entender as diferenças entre elas, edite sua resposta e explique o que a torna melhor / diferente das outras.
Máximo Juhász

esta expressão não leva em conta ips legais como 8.8.8.8 echo "8.8.8.8" | grep -Eo '([1-2][0-9]{0,2}\.){3,3}[1-2][0-9]{0,2}'=> sem resultado #
317


0

Expressão regular para corresponder a um endereço IP no TCL

defina um "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"
}

-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 código acima pode ser modificado para "filtrar" o IP fornecido para o padrão desejado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.