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.

Jennifer
sumber
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.

udo
sumber
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
Joe Casadonte
sumber
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!

Dominik George
sumber
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.

Stefan Seidel
sumber
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;
Arnaud B.
sumber
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 )
cYrus
sumber
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

Thomas
sumber
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.
Falk
sumber
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

Suhail
sumber
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

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

Contoh: curl http://korben.info/ip | grep "IP terlihat depuis mon serveur" | grep -Eo '([0-9] {1,3}.?) {4}'

pengguna2357585
sumber
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"
}
abhilash.malla
sumber
-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.

Niko
sumber