때때로 CIDR 범위를 Apache 로그 파일에서 grep하고 싶습니다. 이는 자연 경계 (/ 8, / 16 및 / 24)에 속하는 범위에는 쉽지만 / 17 및 / 25와 같은 다른 범위에는 쉽지 않습니다.
예 :
# 192.168.0.0/16: (easy)
grep " 192\.168\." access_log
# 192.168.128.0/17: (more thought required)
grep -E " 192\.168\.(12[89]|1[3-9][0-9]|2[0-5][0-9])\." access_log
# 192.168.0.0/17: (more thought required)
grep -E " 192\.168\.([0-9]|[0-9][0-9]|1[01][0-9]|12[0-7])\." access_log
# 192.168.128.0/18: (straining my brain)
grep -E " 192\.168\.(1[2-8][0-9]|19[01])\." access_log
이러한 정규식 192.168.001.001
은 아파치 로그 파일에는 문제가 없지만 다른 로그 파일에있을 수있는 등의 0을 포함하는 IP 주소를 무시 합니다. 특히 프린터는 선행 제로를 좋아하는 것 같습니다. 선택적 0을 정규식에 추가하는 것은 쉽지만 전체를 조금 더 어렵게 만듭니다. 더 쉬운 방법이 있어야합니다.
CIDR 범위와 일치하는 파일에서 행을 쉽게 선택할 수 있습니까?
멋진 정규 표현식 확장 프로그램은 작업을 더 쉽게 할 수 있도록 다른 도구 ( 필요한 경우 awk
또는 perl
필요한 경우 하나의 라이너가되기를 원함)로 간주됩니다. 이상적으로, 내가 원하는 것은
grep "[:CIDR 192.168.128.0/18:]" access_log
CIDR 범위를 적절한 정규식으로 변환하는 도구도 좋습니다.
$ cidr2regex 192.168.0.0/18
192\.168\.(1[2-8][0-9]|19[01])\.[0-9]{1,3}
또는
$ grep -E "$(cidr2regex 192.168.0.0/18)" access_log
답변이 IPv6에도 적용되는 경우 보너스 포인트.
답변
놀랍게도이를위한 도구가 grepcidr
있습니다.
기본적으로 내가 알고있는 시스템에는 포함되어 있지 않지만 여기서 다운로드 할 수 있으며 Ubuntu 패키지 저장소와 FreeBSD 포트 컬렉션에도 있습니다.
(버전 2.0은 IPv6 네트워크에서도 작동합니다)
답변
최근에 릴리스 된 rgxg
명령 행 도구는 CIDR 블록의 모든 주소와 일치하는 정규식을 생성합니다.
$ rgxg cidr 192.168.128.0/18
192\.168\.(19[01]|1[3-8][0-9]|12[89])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])
또는
$ rgxg cidr 2001:db8:a:b:c:d::/112
2001:0?[Dd][Bb]8:0?0?0?[Aa]:0?0?0?[Bb]:0?0?0?[Cc]:0?0?0?[Dd]((::[0-9A-Fa-f]{1,4}|::|:0?0?0?0(::|:[0-9A-Fa-f]{1,4}))|:0\.0(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){2})
자세한 내용은 http://rgxg.sf.net을 참조하십시오 .