다음과 같은 파일에 나타날 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.4
IP 주소를 유효한 주소로 받아들입니다 . 정규 표현식은 다음과 같습니다.완전히점으로 구분된 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])\]$'
...완전히 검증하는 것이 얼마나 중요한지에 따라 그만한 가치가 있을 수도 있고 그렇지 않을 수도 있습니다.