하나의 명령으로 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까지의 모든 표현식과 일치합니다.