web-dev-qa-db-ja.com

Apacheログからuniq IPアドレスをソートします

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を使用しようとしました。

ヒントはありますか?

35
Arthur

これは遅いかもしれませんが、最初のソートで数値を使用すると、希望する結果が得られます。

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
95
linsort

cat | awkを使用する理由使用する必要があるのはawkのみです。

awk '{ print $1 }' /var/log/*access*log | sort -n | uniq -c | sort -nr | head -20
17
Benjamin Dupuis

単純なsort -nは機能しませんでしたが、カウンターとIPの間に数字以外の文字を追加すると問題が解決しました。

cat access.* | awk '{ print $1 } ' | sort | uniq -c | sed -r 's/^[ \t]*([0-9]+) (.*)$/\1 --- \2/' | sort -rn
4
Arthur

これは動作するはずです

cat access.* | awk '{ print $1 }' | sort | awk '{print $1 " " $2;}' | sort -n

問題が見えません。

ファイル内の制御文字?

ファイルシステムがいっぱいです(一時ファイル)?

2
tue

ソートが期待どおりに行われない場合は、おそらくロケールの問題が原因です。

| 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

0
Antony Gibbs