여러 Apache 로그에서 일부 요청을 찾아야 합니다. 내 유일한 요청은 다음과 같습니다.
내가 가지고 있는 50개 IP 범위 목록에 포함되지 않은 IP 주소의 요청만 확인하면 됩니다.
정규식 awk grep 또는 다른 것을 조합하여 이를 달성하려면 어떻게 해야 합니까? 쉬운 방법이 생각나지 않습니다. 아이디어는 각 줄을 가져와 첫 번째 부분(IP 주소)을 가져와 모든 범위를 포함하는 파일과 일치시키고 존재하지 않으면 표시하는 것입니다. 어떻게 해야할지 모르므로 어떤 도움이라도 환영합니다!
견본:
일반적인 http 로그 라인은 다음과 같습니다.
123.456.789.012 - - [22/Oct/2012:06:37:48 +0100] "GET /test/test HTTP/1.1" 302 224 "-" "some user agent/4.3.5"
내 IP 범위 파일의 일반적인 줄은 다음과 같습니다.
192.168.0.1 - 192.168.0.255
물론, 필요한 경우 IP 범위 파일을 192.168.0.1/24 표현으로 변환할 수 있습니다. 좋은 점은 모든 범위가 클래스 C라는 것입니다(방금 알아차렸음). 따라서 IP 주소의 처음 3개 부분만 일치할 것으로 추측됩니다. 이 정도면 충분할 것입니다.
답변1
간단하고 조악한 방법은 grep을 사용하는 것입니다.
파일 생성(범위.txt) 범위는 다음과 같습니다.
192\.168\.0\.[0-9]*
10\.0\.0\.[0-9]*
기존 범위 파일에서 파일을 만들려면 sed
다음과 같이 사용하세요.
sed -n -e 's/^\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\) .*$/^\1\\.\2\\.\3\\.[0-9]* /p' your-range-file > ranges.txt
그런 다음 grep을 사용하여 다음과 같이 해당 파일의 패턴과 일치하는 행을 제외합니다.
$ grep -v -f ranges.txt apache-log-file.log
또는
$ cat apache-log-file.log | < do some pre cleaning > | grep -v -f ranges.txt
이렇게 하면 시작할 수 있지만 쿼리를 자주 실행하고 대용량 로그 파일에 대해 실행해야 하는 경우에는 좋은 솔루션이 아닐 수 있습니다.
행운을 빌어요!
답변2
Log는 로그 파일이고 iprange는 iprange가 포함된 파일입니다. 솔루션의 Perl 부분은 IP 주소의 처음 3개 구성 요소를 가져오고, 이 구성 요소가 ipranges 파일에 없으면 for 루프가 이를 인쇄합니다.
for i in `perl -lne 'print $1 if (m/(\d{1,3}\.\d{1,3}\.\d{1,3})\.\d{1,3}/);' log`
> do
> grep -q $i iprange || echo $i;
> done