로그 파일에서 특정 데이터를 선택해야 합니다. 두 개의 스크립트가 필요합니다.
- 방문한 적이 있는 IP 주소를 모두 선택해야 합니다.
/page1
/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를 구분합니다).