2010-10-24 12:00:49 +0000 2010-10-24 12:00:49 +0000
36
36

Quale espressione regolare posso usare per abbinare un indirizzo IP?

Con la seguente sintassi grep voglio abbinare tutti gli indirizzi IP in un file (da uno script ksh)

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

Il problema: Abbina anche parole (IP) che hanno più di 4 ottetti:

1.1.1.1.1

oppure

192.1.1.1.160

Come posso abbinare un IP valido e solo indirizzi IP con 4 ottetti? Posso anche usare Perl - una soluzione con una sola linea di sintassi, se grep non funziona.

Risposte (12)

57
57
57
2010-10-24 13:01:43 +0000

prova questo:

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

che corrisponde a tutte le espressioni da 0.0.0.0 a 999.999.999.999

con

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

otterrete solo indirizzi IP

nota: su solaris probabilmente egrep farà il lavoro.

10
10
10
2010-10-24 13:50:10 +0000

Com'è questo:

perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts
5
5
5
2012-09-13 08:12:16 +0000
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;
5
5
5
2012-09-13 08:35:57 +0000

Per trovare solo corrispondenze con 4 ottetti esatti (escludendo cose come 1.1.1.1.1.1) usa questo:

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

Non dovrebbe mai rilevare indirizzi non IP. L'espressione potrebbe essere più complessa per verificare più cose, ma questo dovrebbe funzionare per la maggior parte dei casi. Non corrisponderà a uno 0 precedente poiché 010.1.12.1 non è un modo comune di scrivere indirizzi IP.

5
5
5
2012-06-26 11:15:04 +0000

Il flag

-w / --word-regexp

a grep lo fa corrispondere solo ai confini delle parole, il che significa che la vostra corrispondenza deve essere circondata da spazi bianchi o iniziare / finire all'inizio / fine della linea!

3
3
3
2010-10-24 15:14:58 +0000

Un po’ complicato, ma dovrebbe funzionare:

( X='\([0-9]\{1,2\}\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)' ; grep "\([^\.]\|^\)$X\.$X\.$X\.$X\([^\.]\|$\)" file )
1
1
1
2015-11-17 09:56:08 +0000

Una versione più corta della regex lunga:

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

Si prega di usare grep -E o egrep a seconda della versione del vostro sistema operativo

0
0
0
2015-04-17 11:17:29 +0000

Espressione regolare per abbinare un indirizzo ip in TCL

impostare un “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"
}
0
0
0
2016-09-01 09:46:09 +0000

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

Esempio: curl http://korben.info/ip | grep “IP visible depuis mon serveur” | grep -Eo ‘([0-9]{1,3}.?){4}’

0
0
0
2013-09-02 05:56:39 +0000

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])$’

Versione modificata della risposta di Arnaud B.

Questa espressione non corrisponderà agli indirizzi IP con gli 0 iniziali. ad esempio, non corrisponderà a 192.168.1.01 Questa espressione non corrisponderà agli indirizzi IP con più di 4 ottetti. ad esempio, non corrisponderà a 192.168.1.2.3

0
0
0
2015-10-29 18:58:11 +0000

Sto usando egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts per abbinare gli indirizzi IP all'inizio di una linea. Può anche essere usato senza lo ^ per permettere spazi bianchi o altri caratteri prima dell'indirizzo 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.
-1
-1
-1
2017-02-15 10:02:50 +0000

Ecco cosa ha funzionato per me per ksh e ksh93 in 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]) ]] && echo OK || echo NOK Quanto sopra può essere modificato per “filtrare” l'IP fornito a qualsiasi modello desiderato.