Ekspresi reguler apa yang dapat saya gunakan untuk mencocokkan alamat IP?


35

Dengan grepsintaks berikut saya ingin mencocokkan semua alamat IP dalam file (dari kshskrip)

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

Masalahnya: Ini juga cocok dengan kata-kata (IP) yang memiliki lebih dari 4 oktet:

1.1.1.1.1 

atau

192.1.1.1.160

Bagaimana saya bisa mencocokkan IP yang valid dan hanya alamat IP dengan 4 oktet? Saya juga dapat menggunakan Perl - solusi sintaksis satu baris, jika greptidak berhasil.


4
Itu akan cocok 999.999.999.999juga.
cYrus

4
Jadi, Anda hanya ingin grep alamat IPv4, kan ?
Arjan

5
Secara teknis, alamat IP seperti 192.1.4097itu valid dan diterima oleh Linux glibc dan Windows.
grawity

1
Ah, saya tidak pernah tahu ! ping 2130706433, Pada OS X: PING 2130706433 (127.0.0.1): 56 data bytes.
Arjan

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

Jawaban:


56

coba ini:

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

yang cocok dengan semua ekspresi dari 0.0.0.0hingga999.999.999.999

dengan

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

Anda hanya akan mendapatkan alamat IP

catatan:
pada solaris mungkin egrep akan melakukan pekerjaan itu.


Saya mencoba grep '\ b \ d {1,3} \. \ D {1,3} \. \ D {1,3} \. \ D {1,3} \ b' / etc / hosts tapi saya jangan dapatkan apapun - :(
jennifer

1
@jennifer, Anda harus mengaktifkan ekspresi reguler yang diperluas: grep -E <pattern> <file>(atau, untuk hanya mencetak pertandingan:grep -Eo <pattern> <file>
Arjan

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

3
@udo: Yah ini cocok 1.1.1.1.1tetapi menyembunyikan yang terakhir .1dari output, saya tidak bisa melihat bagaimana itu bisa membantu.
cYrus

1
Regexp Anda tidak cocok 10.0.0.1
Stefan Seidel

10

Bagaimana dengan ini:

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

Bagus! (Ini juga kembali 192.1.1.1.160sebagai 192.1.1.1, yang saya pikir baik untuk penanya pertanyaan.)
Arjan

2
Jika alamat IP konforman benar-benar diinginkan, ini adalah satu-satunya jenis solusi yang memiliki peluang hampir selesai. Ketika saya melihat pertanyaan, saya hanya berpikir "Saya tidak akan menyentuhnya dengan tiang regexp standar sepuluh kaki". Peringatan, peringatan di mana-mana :-).
Daniel Andersson

5

Itu

-w / --word-regexp 

panji untuk grepmembuatnya hanya cocok pada batas kata, yang berarti bahwa pasangan Anda harus dikelilingi oleh spasi atau mulai / berakhir pada awal / akhir baris!


5

Untuk hanya menemukan kecocokan dengan 4 oktet persis (tidak termasuk hal-hal seperti 1.1.1.1.1) gunakan ini:

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

Seharusnya tidak pernah mendeteksi alamat non-IP. Ungkapan bisa lebih kompleks untuk memverifikasi lebih banyak hal tetapi ini harus bekerja untuk sebagian besar kasus. Ini tidak akan cocok dengan 0 sebelumnya karena 010.1.12.1 bukan cara yang umum untuk menulis alamat 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

Agak rumit, tetapi seharusnya berhasil:

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

Bagaimana dengan 127.000.000.001itu? ;-)
Arjan

Sejauh yang saya tahu IP tidak memiliki nol padding.
cYrus

1
Hmmm, ping 127.000.000.001pasti berfungsi di Mac saya. Tetapi kemudian: Saya baru belajar bahwa bahkan ping 2130706433menghasilkan hasil yang sama. :-) Ups, ping 00127.00000.00000.00001terjemahkan ke 87.0.0.1. Aneh ... Atau oktal mungkin? Ya, oktal pasti, jadi Anda benar tentang memimpin nol kurasa.
Arjan

Ya, 00127 (oktal) = 87 (desimal). Tentunya mereka semua IP yang valid, tapi saya kira itu bukan cara standar untuk mewakili mereka. Pokoknya itu tidak diminta oleh penanya.
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]) $ '

Versi modifikasi dari jawaban Arnaud B.

Ungkapan ini tidak akan cocok dengan alamat IP dengan awalan 0s. misalnya, itu tidak akan cocok dengan 192.168.1.01 Ungkapan ini tidak akan cocok dengan alamat IP dengan lebih dari 4 oktet. misalnya, itu tidak akan cocok dengan 192.168.1.2.3


Ini tidak akan cocok dengan 127.0.0.1 juga.
Chris Charabaruk

0

Saya menggunakan egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts untuk mencocokkan alamat IP di awal baris. Ini juga dapat digunakan tanpa ^mengizinkan spasi putih atau karakter lain sebelum alamat 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

Versi pendek dari regex panjang:

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

Silakan gunakan grep -E atau egrep yang sesuai dengan versi OS Anda


2
selamat datang di superuser. Pertanyaan ini sudah memiliki beberapa jawaban bagus. Untuk membantu orang memahami perbedaan di antara mereka, harap edit jawaban Anda dan jelaskan apa yang membuatnya lebih baik / berbeda dari yang lain.
Máté Juhász

ungkapan ini tidak memperhitungkan ips hukum seperti 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}'=> tidak ada hasil
anneb


0

Ekspresi reguler untuk mencocokkan alamat ip dalam TCL

atur "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

Inilah yang bekerja untuk saya untuk ksh dan ksh93 di 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 || gema NOK Di atas dapat dimodifikasi untuk "menyaring" IP yang disediakan untuk pola apa pun yang diinginkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.