nginx 액세스 로그 파일에서 /page1에는 액세스하지만 /page2에는 액세스하지 않는 IP 주소를 찾습니다.

nginx 액세스 로그 파일에서 /page1에는 액세스하지만 /page2에는 액세스하지 않는 IP 주소를 찾습니다.

로그 파일에서 특정 데이터를 선택해야 합니다. 두 개의 스크립트가 필요합니다.

  1. 방문한 적이 있는 IP 주소를 모두 선택해야 합니다./page1
  2. /page1방문 했지만 방문한 적이 없는 IP 주소를 모두 선택해야 합니다./page2

내가 .tar원하는 로그가 파일에 있습니다. 폴더로 추출하고 스크립트를 사용하여 구문 분석하고 삭제하겠습니다. 모든 중복 IP 주소.

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

# filter /page1 visitors
cat access.log | grep "/page1" > /tmp/res.txt
# take the IP portion of record
cat res.txt | grep '^[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*' -o > result.txt

일반적인 액세스 로그는 다음과 같습니다.

162.158.86.83 - - [22/May/2016:06:31:18 -0400] "GET /page1?vtid=nb3 HTTP/1.1" 301 128 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"

답변1

awk '/^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt

고유 IP 당 개수를 원하면 sort -u다음으로 변경하십시오.sort | uniq -c

전체 행이 아닌 요청 경로 필드만 기록하려면 다음을 사용하십시오 /page1.

awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt

참고: nginx 액세스 로그는 Apache 액세스 로그와 동일하다고 생각합니다. 그렇지 않은 경우 필드 수를 계산합니다(수모든공백(nginx 로그의 Date:Time과 TimeZone 사이의 공백 포함)을 사용하고 대신 올바른 필드 번호를 사용하세요.$7

마지막으로 IP 주소(또는 확인된 경우 호스트 이름)와 요청 경로를 인쇄하려면 다음을 수행하세요.

awk -v OFS='\t' '$7 ~ /^\/page1?/ {print $1, $7}' /path/to/access.log |
    sort -u > result.txt

방문했지만 /page1방문한 적이 없는 IP 주소 보기 /page2:

awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result1.txt
awk '$7 ~ /^\/page2?/ {print $1}' /path/to/access.log | sort -u > result2.txt
comm -2 -3 result1.txt result2.txt

comm이 옵션은 두 -2파일에만 나타나는 줄 result2.txt-3두 파일 모두에 나타나는 줄을 억제합니다. 따라서 에 나타나는 줄만 출력됩니다 results1.txt.

자세한 내용은 을 참조하세요 man comm.

답변2

  • Page1을 방문한 IP의 정렬된 목록을 만듭니다.
  • Page2에 액세스하는 IP의 정렬된 목록을 만듭니다.
  • 두 목록 모두에서 "diff"를 사용하여 한 페이지를 방문했지만 다른 페이지는 방문하지 않은 페이지를 찾습니다(목록 시작 부분의 ">" 또는 "<" 기호는 페이지1과 페이지2를 구분합니다).

관련 정보