Bir IP adresiyle eşleştirmek için hangi normal ifadeyi kullanabilirim?


35

Aşağıdaki grepsözdizimi ile bir dosyadaki tüm IP adreslerini eşleştirmek istiyorum (bir kshkomut dosyasından)

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

Sorun: Ayrıca, 4 oktetten daha fazla olan kelimeleri (IP) eşleştirir:

1.1.1.1.1 

veya

192.1.1.1.160

Geçerli bir IP ile sadece 4 oktetli IP adreslerini nasıl eşleştirebilirim ? Çalışmıyorsa, bir satırlık sözdizimi çözümü olan Perl'i de kullanabilirim grep.


4
O da eşleşecek 999.999.999.999.
cYrus 24:10

4
Yani sadece IPv4 adreslerini grep etmek istiyorsunuz, değil mi?
Arjan

5
Teknik olarak, IP adresleri 192.1.4097Linux glibc ve Windows tarafından geçerli ve kabul edilmiştir.
yerçekimi

1
Ah, hiç bilmedim ! ping 2130706433OS X üzerinde: PING 2130706433 (127.0.0.1): 56 data bytes.
Arjan

1
@Arjan: 0x7f.1ve0177.1
Grawity

Yanıtlar:


56

bunu dene:

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

tüm ifadeleri eşleşir 0.0.0.0için999.999.999.999

ile

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

sadece IP adreslerini alacaksınız

not:
Solaris'te muhtemelen egrep işi yapacak.


'\ B \ d {1,3} \. \ D {1,3} \. \ D {1,3} \. \ D {1,3} \ b' / etc / hosts dizinini denedim. bir şey alamadım - :(
jennifer

1
@jennifer, genişletilmiş düzenli ifadeleri etkinleştirmeniz gerekir: grep -E <pattern> <file>(veya yalnızca eşleşmeleri yazdırmak için:grep -Eo <pattern> <file>
Arjan

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

3
@udo: Bu eşleşiyor 1.1.1.1.1ama çıktıdan sonuncuyu gizliyor, .1nasıl yardım edebileceğini göremiyorum.
cYrus

1
Regexp'iniz 10.0.0.1
Stefan Seidel ile

10

Bu nasıl:

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

Güzel! (Bu ayrıca , soru sorucusu için iyi olduğunu düşündüğüm 192.1.1.1.160gibi döner 192.1.1.1.)
Arjan

2
Eğer uygun IP adresleri gerçekten isteniyorsa, bu, tamamlanma olasılığı çok düşük olan tek çözüm türüdür. Soruyu gördüğümde, sadece "10 metrelik standart bir regexp kutbu ile dokunmayacağım" diye düşündüm. Uyarılar, her yerde uyarılar :-).
Daniel Andersson

5

-w / --word-regexp 

greponu sadece kelime sınırlarında eşleştirecek şekilde işaretleyin , yani eşleştirmenizin boşlukla çevrili olması veya satırın başında / sonunda başlaması / bitmesi gerekir!


5

Tam olarak 4 oktet ile eşleşenleri bulmak için (1.1.1.1.1 gibi şeyler hariç) bunu kullanın:

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

IP olmayan adresleri hiçbir zaman algılamamalıdır. İfade daha fazla şeyi doğrulamak için daha karmaşık olabilir, ancak bu çoğu durumda işe yarayabilir. 010.1.12.1 IP adreslerini yazmak için yaygın bir yol olmadığından önceki 0 ile eşleşmeyecektir.


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

Biraz zor, ama işe yaramalı:

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

Peki ya 127.000.000.001sonra? ;-)
Arjan

Bildiğim kadarıyla IP'lerin doldurma sıfırları yok.
cYrus 24/10

1
Hmmm, ping 127.000.000.001kesinlikle Mac'imde çalışıyor. Ama sonra: Ben sadece ping 2130706433aynı sonucu verdiğini bile öğrendim . :-) Hata ping 00127.00000.00000.00001çevirir 87.0.0.1. Garip ... Veya belki de sekizli? Evet, kesinlikle octal, sanırım önde gelen sıfırlar konusunda haklısın.
Arjan

Evet, 00127 (sekizli) = 87 (ondalık). Elbette hepsi geçerli IP’ler ama sanırım onları temsil etmenin standart yolu bu değil. Neyse, asker tarafından talep edilmeyen.
cYrus 24:10

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

Arnaud B.'nin cevabının değiştirilmiş versiyonu.

Bu ifade, IP adresleriyle baştaki 0'larla eşleşmeyecek. örneğin, 192.168.1.01 ile eşleşmiyor Bu ifade 4 oktetten daha fazla olan IP adresleriyle eşleşmeyecek. örneğin, 192.168.1.2.3 ile eşleşmiyor


Bu da 127.0.0.1 ile eşleşmeyecek.
Chris Charabaruk

0

egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts Bir satırın başında IP adreslerini eşleştirmek için kullanıyorum . ^IP adresinden önce beyaz boşluklara veya diğer karakterlere izin vermeksizin de kullanılabilir .

[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

Uzun regex'in daha kısa bir versiyonu:

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

Lütfen işletim sisteminize uygun grep -E veya egrep kullanın


2
süper kullanıcı hoş geldiniz. Bu sorunun zaten birkaç iyi cevabı var. İnsanların aralarındaki farkları anlamalarına yardımcı olmak için lütfen cevabınızı düzenleyin ve diğerlerinden daha iyi / farklı kılan şeyleri açıklayın.
Máté Juhász

bu ifade 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}'=> sonuç yok gibi yasal
ips'leri dikkate almaz


0

TCL'de bir ip adresini eşleştirmek için normal ifade

bir "192.168.10.25" olarak ayarlayın

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

AIX'de ksh ve ksh93 için benim için işe yarayanlar:

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 Tamam || eko NOK Yukarıdaki her hangi bir desene göre sağlanan IP'yi "filtrelemek" için değiştirilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.