나는 다음을 달성하는 방법을 찾고 있습니다.
이것은 nginx 오류 로그의 한 줄입니다.
2014/12/29 21:17:57 [error] 30078#0: *311826 openat() "/var/www/html/images/images/Outlet-Celine-Boston-Square-Calfskin-Bags-Red_celine_2140_1.jpg" failed (2: No such file or directory), client: 207.46.13.42, server: server.domain.tld, request: "GET /images/images/Outlet-Celine-Boston-Square-Calfskin-Bags-Red_celine_2140_1.jpg HTTP/1.1", host: "www.buylvneverfullpm.net"
수천 개가 더 있으므로 방법이 필요합니다.
- 행에 'host: "*"'가 포함되어 있는지 확인합니다. 여기서 *는 URL입니다.
- 호스트 값 가져오기: "www.xxx.yyy"
- 처음에 www를 제거하세요.
- 각 xxx.yyy의 발생 횟수를 계산합니다.
- 각 고유 호스트 값의 발생을 가장 높은 값에서 가장 낮은 값으로 정렬합니다.
나는 다음을 사용하고 있습니다 :
awk '($20 ~ /GET/)' /var/log/nginx/error_log | awk '{print $24}' | sort | uniq -c | sort -rn
그러나 "www"는 제거되지 않으므로 중복된 항목이 있습니다.
답변1
그냥 awk
당신을 위해 모든 것을 처리
awk '$20 ~ /GET/{gsub(/"/, "", $24); sub(/[^.]*\./, "", $24); a[$24]++};
END{for (k in a)print k, a[k]}' /var/log/nginx/error_log