IP 주소 그룹에 대한 busybox 정규 표현식

IP 주소 그룹에 대한 busybox 정규 표현식

다음과 같은 파일에 나타날 IP 주소 집합을 확인할 수 있어야 합니다.

IP_SUBNETS=['10.1.111.0','10.2.111.0','10.2.123.0']

","로 구분하고 작은따옴표로 묶어서 n개의 IP 주소를 허용하고 전체 "목록"이 대괄호로 열리고 닫히는 정규식을 작성하고 싶습니다.

정규식의 bash 예제를 찾았지만 busybox에서 작동하는 항목을 찾는 데 어려움을 겪고 있습니다.

이것이 내가 지금까지 가지고 있는 것입니다:

grep IP_SUBNETS myfile | cut -c 12- | grep '^\[[0-9].'

하지만 그룹화를 제대로 할 수없는 것 같습니다. 일명 서브넷당 하나의 그룹입니다.

편집 1

#!/bin/sh
iplist=['10.112.123.0'] 
pass="$(echo $iplist | grep -E '^\[(([0-9]{1,3}\.){3}[0-9]{1,3},)*([0-9]{1,3}\.){3}[0-9]{1,3}\]$'"
echo "$pass"

답변1

여기서는 다음과 같은 기능이 작동합니다.

busybox grep -E '^\[(([0-9]{1,3}\.){3}[0-9]{1,3},)*([0-9]{1,3}\.){3}[0-9]{1,3}\]$'

(busybox는 내 기본 grep이 아니므로 "busybox" 접두어가 붙습니다).

그래야 한다최대완벽하지 않더라도 목록을 확인하세요. 예를 들어, 300.1.2.4IP 주소를 유효한 주소로 받아들입니다 . 정규 표현식은 다음과 같습니다.완전히점으로 구분된 4개의 숫자가 유효한 서브넷 시작 주소를 나타내는지 확인하는 것은 훨씬 더 복잡합니다.

분석해 보겠습니다. 먼저, 이 중 일부는 반복된다는 점에 유의하세요. I잠시만 기다려 주십시오 . 그러면 전체 목록이 대괄호로 묶인 ^\[(I,)*I\]$쉼표로 구분된 목록이 제공되는 것을 볼 수 있습니다 . 그것이 무엇인지 다시 살펴보면 I또 다른 반복되는 패턴을 발견하면 I더욱 간단해집니다 . 그렇다면...십진수로 구분된 4개의 옥텟이군요. 물론 쉘 스크립트에서는 변수를 사용하여 이러한 간단한 빌딩 블록에서 패턴을 구축할 수 있는데, 이는 가독성과 유지 관리에 많은 도움이 됩니다.([0-9]{1,3}\.){3}[0-9]{1,3}O = [0-9]{1,3}(O.){1,3}O

다음 테스트 데이터로 테스트했습니다(예상 결과는 테스트 데이터 파일이 아닌 주석으로 표시됨).

1.2.3.4                          # bad: no brackets
[1.2.3.4]                        # good
[1.2.3.44]                       # good
[1.2.3.4                         # bad: missing bracket
1.2.3.4]                         # bad: missing bracket
[1.2.3.4,]                       # bad: empty item
[1.2.3.4,5.6.7.8]                # good
[1.2.3.4,5.6.7.8,]               # bad: empty item
[1.2.3.4,5.6.7.E]                # bad: E is not a number
[1.2.3.4,,5.6.7.8]               # bad: empty item
[1.2.3.1234]                     # bad: 1234 is more than 3 digits

편집: 사용할 수 있습니다 O = ([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5]) . 더 간단한 방법이 있을 수 있지만 확실하지는 않습니다. 숫자 0-255를 사용하면 패턴이 더 길어집니다.

busybox grep -E '^\[((([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5]),)*(([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\]$'

...완전히 검증하는 것이 얼마나 중요한지에 따라 그만한 가치가 있을 수도 있고 그렇지 않을 수도 있습니다.

관련 정보