이름순으로 정렬하는 방법은 무엇입니까?

이름순으로 정렬하는 방법은 무엇입니까?

나는 기록을 가지고 있습니다. 레코드의 형식은 다음과 같습니다.

<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

관련 정보