
私は記録を持っています。レコードの形式は次のとおりです。
<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