ApacheログからIPアドレスを抽出し、カウントし、ソートしようとしています。
そして、何らかの理由で、ソート部分は恐ろしいです。
コマンドは次のとおりです。
cat access.* | awk '{ print $1 }' | sort | uniq -c | sort -n
出力例:
16789 65.X.X.X
19448 65.X.X.X
1995 138.X.X.X
2407 213.X.X.X
2728 213.X.X.X
5478 188.X.X.X
6496 176.X.X.X
11332 130.X.X.X
これらの値が実際にソートされていない理由がわかりません。また、行の先頭の空白(sed 's/^[\t ]*//g'
)を削除し、何も変更しないsort -n -t" " -k1
を使用しようとしました。
ヒントはありますか?
これは遅いかもしれませんが、最初のソートで数値を使用すると、希望する結果が得られます。
cat access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20
出力:
29877 93.xxx.xxx.xxx
17538 80.xxx.xxx.xxx
5895 198.xxx.xxx.xxx
3042 37.xxx.xxx.xxx
2956 208.xxx.xxx.xxx
2613 94.xxx.xxx.xxx
2572 89.xxx.xxx.xxx
2268 94.xxx.xxx.xxx
1896 89.xxx.xxx.xxx
1584 46.xxx.xxx.xxx
1402 208.xxx.xxx.xxx
1273 93.xxx.xxx.xxx
1054 208.xxx.xxx.xxx
860 162.xxx.xxx.xxx
830 208.xxx.xxx.xxx
606 162.xxx.xxx.xxx
545 94.xxx.xxx.xxx
480 37.xxx.xxx.xxx
446 162.xxx.xxx.xxx
398 162.xxx.xxx.xxx
cat | awk
を使用する理由使用する必要があるのはawk
のみです。
awk '{ print $1 }' /var/log/*access*log | sort -n | uniq -c | sort -nr | head -20
単純なsort -n
は機能しませんでしたが、カウンターとIPの間に数字以外の文字を追加すると問題が解決しました。
cat access.* | awk '{ print $1 } ' | sort | uniq -c | sed -r 's/^[ \t]*([0-9]+) (.*)$/\1 --- \2/' | sort -rn
これは動作するはずです
cat access.* | awk '{ print $1 }' | sort | awk '{print $1 " " $2;}' | sort -n
問題が見えません。
ファイル内の制御文字?
ファイルシステムがいっぱいです(一時ファイル)?
ソートが期待どおりに行われない場合は、おそらくロケールの問題が原因です。
| LC_ALL=C sort -rn
awk '{array[$1]++}END{ for (ip in array) print array[ip] " " ip}' <path/to/Apache/*.log> | LC_ALL=C sort -rn
ソース ソートが期待どおりにソートされない(スペースとロケール)
https://www.commandlinefu.com/commands/view/9744/sort-ip-by-count-quickly-with-awk-from-Apache-logs