名前順に並べ替えるには?

名前順に並べ替えるには?

私は記録を持っています。レコードの形式は次のとおりです。

<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数でソートしたくない場合は、2 番目の列でソートを使用することもできます。

gawk '$9=="404"' log.txt | gawk '{print $7 , $9}' |  sort | uniq -c | sort -k 2

行数を計算する必要がない場合は、sort -uを使用して一意の行を取得し、2つのawkパイプラインを1つにマージできます。

gawk '$9=="404" {print $7 , $9}' log.txt | sort -u

発生回数でソートし、1つのコマンドですべての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

おすすめ記事