IP 주소와 일치시키기 위해 어떤 정규식을 사용할 수 있습니까?


35

다음 grep구문을 사용하면 파일의 모든 IP 주소를 ksh스크립트 에서 일치시키고 싶습니다.

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

문제 : 또한 4 옥텟보다 많은 단어 (IP)와 일치합니다.

1.1.1.1.1 

또는

192.1.1.1.160

유효한 IP와 4 옥텟의 IP 주소 만 일치 시키려면 어떻게 해야합니까? grep작동하지 않는 경우 한 줄 구문 솔루션 인 Perl을 사용할 수도 있습니다 .


4
일치 999.999.999.999합니다.
cYrus

4
그래서, 당신은 IPv4 주소를 grep을 할, 권리 ?
Arjan

5
기술적 192.1.4097으로 Linux glibc 및 Windows에서와 같은 IP 주소 는 유효하며 허용됩니다.
grawity

1
아, 난 몰랐어 ! ping 2130706433OS X의 경우 : PING 2130706433 (127.0.0.1): 56 data bytes.
Arjan

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

답변:


56

이 시도:

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

0.0.0.0~ 에서 모든 표현식과 일치999.999.999.999

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

당신은 IP 주소를 얻을 것이다

참고 :
solaris에서 egrep 은 아마 그 일을 할 것입니다.


grep '\ b \ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} \ b'/ etc / hosts를 시도하지만 아무것도 얻지
제니퍼

1
@jennifer, 당신은 확장 정규 표현식을 활성화해야합니다 : grep -E <pattern> <file>또는 일치를 인쇄하려면 :grep -Eo <pattern> <file>
Arjan

이처럼? grep -E '\ b \ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} \ b'/ etc / hosts
제니퍼

3
@udo : 이것은 일치 1.1.1.1.1하지만 .1출력 에서 마지막 을 숨 깁니다 . 어떻게 도움이되는지 볼 수 없습니다.
cYrus

1
정규식이 10.0.0.1와 일치하지 않습니다
Stefan Seidel

10

이건 어떻습니까:

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

좋은! (이것은으로 반환 192.1.1.1.160되어 192.1.1.1질문을받는 사람에게는 괜찮다고 생각합니다.)
Arjan

2
적합한 IP 주소가 실제로 필요한 경우 이것이 완료 될 가능성이있는 유일한 유형의 솔루션입니다. 제가 그 질문을 보았을 때, 나는 단지 "10 피트 표준 정규식 극으로 그것을 만지지 않을 것"이라고 생각했습니다. 주의 사항, 모든 곳에서주의 사항 :-).
Daniel Andersson

5

그만큼

-w / --word-regexp 

플래그를 grep단어 경계에서만 일치 시키려면 일치 항목을 공백으로 묶거나 줄의 시작 / 끝에서 시작 / 종료해야합니다.


5

정확히 4 옥텟과 일치하는 항목 만 찾으려면 (1.1.1.1.1과 같은 것 제외) 다음을 사용하십시오.

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

IP 주소가 아닌 주소는 감지하지 않아야합니다. 더 많은 것을 확인하기 위해 표현이 더 복잡 할 수 있지만 대부분의 경우 작동합니다. 010.1.12.1은 IP 주소를 쓰는 일반적인 방법이 아니기 때문에 선행 0과 일치하지 않습니다.


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

조금 까다 롭지 만 작동해야합니다.

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

무엇에 대한 127.000.000.001다음? ;-)
Arjan

내가 아는 한 IP에는 패딩 제로가 없습니다.
cYrus

1
흠, ping 127.000.000.001확실히 내 Mac에서 작동합니다. 그러나 다음 ping 2130706433과 같은 결과를 얻었습니다. :-) 죄송 ping 00127.00000.00000.00001합니다 87.0.0.1. 홀수 ... 아니면 8 진수? 그렇습니다, 8 진입니다. 그래서 당신은 제가 생각하는 제로를 0으로 맞습니다.
Arjan

예, 00127 (8 진수) = 87 (10 진수)입니다. 분명히 그것들은 모두 유효한 IP이지만 IP를 나타내는 표준 방법이 아니라고 생각합니다. 어쨌든 요청자가 요청하지 않았습니다.
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]) $ '

Arnaud B. 답변의 수정 된 버전.

이 표현식은 IP 주소가 선행 0과 일치하지 않습니다. 예를 들어 192.168.1.01과 일치하지 않습니다.이 식은 4 옥텟을 초과하는 IP 주소와 일치하지 않습니다. 예를 들어 192.168.1.2.3과 일치하지 않습니다.


이것은 127.0.0.1 과도 일치하지 않습니다.
Chris Charabaruk

0

egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts 줄의 시작 부분에서 IP 주소를 일치시키는 데 사용 하고 있습니다. ^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

긴 정규식의 짧은 버전 :

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

OS 버전에 적합한 grep -E 또는 egrep을 사용하십시오


2
수퍼 유저를 환영합니다. 이 질문에는 이미 몇 가지 좋은 답변이 있습니다. 사람들이 차이점을 이해하도록 돕기 위해 답변을 수정하고 다른 답변과 다른 점을 설명하십시오.
Máté Juhász

이 표현은 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}'=> 결과 와 같은 합법적 인 IP를 고려하지 않습니다.
Anneb


0

TCL에서 IP 주소를 일치시키기위한 정규식

"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

다음은 AIX에서 ksh 및 ksh93에서 나를 위해 일한 것입니다.

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 제공된 IP를 원하는 패턴으로 "필터링"하기 위해 위의 내용을 수정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.