자주 사용하는 IP를 찾기 위해 로그 파일을 구문 분석합니다.

자주 사용하는 IP를 찾기 위해 로그 파일을 구문 분석합니다.

그래서 한데 모아서 잡아당겼어요못된내 로그에서 ip가 사라졌습니다. 누구든지 더 나은 결과를 얻을 수 있는 개선 사항이나 다른 제안 사항이 있습니까?

일반적인 아이디어는 다음과 같습니다.

  1. 로그 파일에서만 IP 추출
  2. 정렬하세요
  3. 고유하고 세어보세요
  4. 다시 정렬하세요

그리고 오케스트라:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

답변1

나는 항상 이것을 사용합니다 :

tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1

tail실제로 얼마나 뒤로 돌아가고 싶은지에 대한 제한을 설정할 수 있습니다. (어떤 이유로든) 로그 회전을 사용하지 않는 경우에는 괜찮습니다. 두 번째로 사용하고 있습니다 . awk대부분의 로그가 공백으로 구분되어 있으므로 통과하고 있습니다. 추가 적절한 변수를 사용하면 추가 정보(방문한 URL, 상태, 브라우저 등)를 추출할 수 있습니다 $. 마지막으로 uniq접촉 쌍에서만 작동하는 결함이 있습니다 . 즉:

A
A
A
A
B
A
A

생산할 것입니다:

4 A
1 B
2 A

원하는 출력이 아닙니다. 따라서 첫 번째 열(이 경우에는 ips이지만 다른 열도 정렬할 수 있음)을 정렬한 다음 uniq정렬하고 마지막으로 가장 높은 위반자를 볼 수 있도록 개수를 오름차순으로 정렬합니다.

답변2

재창조하고 있는 것 같군요실패 2 금지바퀴.

Fail2ban을 살펴보세요. 이미 귀하의 요구 사항을 충족할 수도 있지만 그렇지 않은 경우 쉽게 사용자 정의할 수 있습니다.

답변3

Marco Ceppi가 awk더 나은 도구라는 점에서는 옳지만, awk도 awk sort보다 더 나은 도구 입니다. uniq그 이유는 해당 논리를 awk1000줄만 따라가는 경우에는 큰 차이가 없지만 원하는 경우에는 . 엄청난 양의 GB 단위 로그 파일을 살펴보고 awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n필요한 작업을 수행하지만 대용량 파일의 경우 훨씬 더 빠릅니다. IP 주소를 키로, IP 발생 횟수를 값으로 사용하여 awk에 IP 배열을 생성합니다.

속도가 증가한 이유는 awk가 데이터를 한 번만 전달하고 대부분의 작업을 수행하기 때문입니다(최종 출력 정렬 제외). 다른 접근 방식을 사용하면 전송 로그에 1,000,000개의 라인이 있는 경우 awk는 해당 1,000,000개의 라인을 읽고 1,000,000개의 IP를 내보낸 다음 전체 1,000,000개의 IP를 정렬하고 현재 정렬된 1,000,000개의 IP를 uniq로 전송하여 더 작은 값으로 줄입니다. 정렬 전 데이터의 양입니다. 1,000,000개 이상의 IP를 파이프/다중 전달하는 대신 awk는 거의 모든 작업을 한 번에 수행합니다.

내 노트북에서 5,513,132줄의 Apache 로그(1.1GB)를 사용하여 속도를 비교하면 다음과 같습니다.

  • 2미터 45초cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
  • 0미터 40초cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n

관련 정보