linux + IP 주소를 3옥텟 또는 4옥텟과 일치시킵니다.

linux + IP 주소를 3옥텟 또는 4옥텟과 일치시킵니다.

하나의 명령으로 IP 주소를 4옥텟 또는 3옥텟과 일치시키려면 어떻게 해야 합니까?

대상 - xxx.xxx.xxx 또는 xxx.xxx.xxx.xxx와 일치(구문은 Linux 및 Solaris에 적합해야 함)

다음 명령을 하나로 결합하려면 어떻게 해야 합니까?

 echo $IP_ADDRESS  | grep  '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
 echo $IP_ADDRESS  | grep  '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' 

저도 이거 해봤는데(안됐어요)

        echo $IP_ADDRESS | egrep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}|[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"

답변1

 if expr ".$IP_ADDRESS" : '\(\.[0-9]\{1,3\}\)\{3,4\}$' > /dev/null 
 then echo match
 else echo no match
 fi

문자열이 아닌 줄을 일치시키는 데 사용되므로 grep여기서는 사용할 수 없습니다 . 매개변수를 대체하기 때문에 이들 중 어떤 것도 grep사용할 수 없습니다 . echo또한 변수를 따옴표로 묶지 않은 채 둘 수 없습니다. 그렇지 않으면 파일 이름 생성 및 토큰화가 발생합니다.

해당 패턴과 일치하는 입력 파일의 행을 찾으려면 grep다음과 같이 사용해야 합니다.

 grep -Ex '[0-9]{1,3}(\.[0-9]{1.3}){2,3}' < input.file

-x전체가 10진수 3자리 또는 4자리에서 최대 3자리(옵션)로 구성된 모든 행이 보고됩니다.

텍스트 파일에서 3개 또는 4개의 IP 주소를 모두 최대 3자리까지 추출하려는 경우 가장 좋은 방법은 다음을 사용하는 것입니다 perl.

perl -lne 'print for grep /^\d{1,3}(\.\d{1,3}){2,3}$/, /[\d.]+/g'

출력됩니다:

111.222.333
1.2.3.4

다음과 같은 입력의 경우:

foo 1.1234.2.3 1.2 1.2.3.4.5 111.222.333 bar1.2.3.4@

다음과 같이 할 수도 있습니다.

tr -cs 0-9. '[\n*]' < input.file |
  grep -Ex '[0-9]{1,3}(\.[0-9]{1.3}){2,3}'

답변2

이렇게 하면 트릭을 수행할 수 있습니다.

echo $IP_ADDRESS | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'

또는 명명된 집합을 사용합니다.

echo $IP_ADDRESS | grep -Eo '([[:digit:]]{1,3}\.[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){1,2})'

# 4 octets
$ echo '10.10.0.1' | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
10.10.0.1

# 3 octets
$ echo '10.10.0' | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
10.10.0

# 2 octets
$ echo '10.10' | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
$

노트:이는 0.0.0.0에서 999.999.999.999까지의 모든 표현식과 일치합니다.

관련 정보