나는 기록을 가지고 있습니다. 레코드의 형식은 다음과 같습니다.
<client host> - - [<timestamp with timezone>] <HTTP-request line (type, URL, version)> <Code of HTTP-response> <Number of sent bytes or '-', if the response is empty> <Referer string ('-' means direct request without referer)> <Client info (browser, application)>
예를 들어 다음 5줄은 다음과 같습니다.
20158147070.user.veloxzone.com.br - - [29/Oct/2006:06:59:18 -0700] "GET /example/.comments
HTTP/1.1" 404 293 "http://www.example.org/example/" "Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.1; SV1)"
20158147070.user.veloxzone.com.br - - [29/Oct/2006:06:59:18 -0700] "GET /example/.comments
HTTP/1.1" 404 293 "http://www.example.org/example/" "Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.1; SV1)"
adorno.ub.uni-duesseldorf.de - - [10/Oct/2006:06:59:37 -0700] "GET /example/.comments
HTTP/1.0" 404 281 "-" "Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.0.2) Gecko/20030208
Netscape/7.02"
nat240.ariba.com - - [29/Oct/2006:07:40:47 -0700] "GET //example/example.atom' HTTP/1.1" 304
298 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909
Thunderbird/1.5.0.7"
nat240.ariba.com - - [31/Oct/2006:07:10:47 -0700] "GET /example/example.atom' HTTP/1.1" 304
297 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909
Thunderbird/1.5.0.7"
행의 나머지 부분에 관계없이 URL 이름으로 정렬해야 합니다.
404 오류를 찾기 위해 awk를 사용하고 있는데 이제 정렬해야 합니다.
cat log.txt | gawk '$9=="404"' | gawk '{print $7 , $9}' | uniq -c | sort -r
하지만 나는 이것을 가지고 있습니다 :
2 /example/.comments 404
1 /example/.comments 404
나는 이것이 필요하다:
3 /example/.comments 404
.........
1. /example/.comments - 28 - 32.2%
2. /example/example.atom.xml - 9 - 10.3%
3. /example/When/200x/2003/04/10/-big/Concorde.jpg - 8 - 9.2%
4. /example/When/200x/2006/03/30/-big/IMG_4613.jpg - 7 - 8.0%
5. /example/When/200x/2003/07/25/-big/guild-2.jpg - 6 - 6.9%
6. /example/Patti-Smith.png - 5 - 5.7%
7. /example/IMGP4289-2.png - 5 - 5.7%
8. /example/IMGP4287.png - 5 - 5.7%
9. /example/Image-Search-Mystery.png - 5 - 5.7%
10. /example/Horses.png - 5 - 5.7%
11. /example/When/200x/2004/02/27/-big/Unreal.png - 4 - 4.6%
형식은 목록 또는 카운터, 이름 url, 고유 번호, 모든 404 오류의 비율 순입니다.
답변1
명령을 sort
사용하기 전에 항상 사용해야 합니다 . uniq
작동 방식은 uniq
중복 항목이 차례로 배열된 경우에만 중복 항목을 계산하는 것입니다. 동일한 행에 다른 행 뒤에 여러 행이 있는 경우 해당 행은 이전 중복 항목 중에서 계산되지 않습니다.
동일한 행의 정확한 개수를 얻으 sort
려면 항상 및 파이프를 사용해야 합니다 .uniq -c
또한 첫 번째 열은 일부 개수이므로 sort -n
발생 횟수별로 정렬하려면 이를 사용해야 합니다.
첫 번째 cat을 제거하고 출력 대신 파일에서 직접 awk를 실행할 수도 있습니다 cat
.
다음과 같은 것을 사용해야 합니다:
gawk '$9=="404"' log.txt | gawk '{print $7 , $9}' | sort | uniq -c | sort -n
sort -k
개수별로 정렬하지 않으려면 두 번째 열별로 정렬을 사용할 수도 있습니다.
gawk '$9=="404"' log.txt | gawk '{print $7 , $9}' | sort | uniq -c | sort -k 2
행 수를 계산할 필요가 없으면 sort -u를 사용하여 고유한 행을 가져오고 두 개의 awk 파이프라인을 하나로 병합할 수 있습니다.
gawk '$9=="404" {print $7 , $9}' log.txt | sort -u
발생 횟수별로 정렬하고 하나의 명령으로 모든 404를 계산하려면 awk에서 다음을 수행해야 합니다.
gawk '{PROCINFO["sorted_in"] = "@val_num_asc"} $9=="404" {count_url[$7]++} {count_404[$9]++} END {for(url in count_url) print count_url[url],url;print "number of 404 errors: "count_404[404];}' log.txt