頻繁に使用するIPを見つけるためにログファイルを解析します。

頻繁に使用するIPを見つけるためにログファイルを解析します。

だから私は集めて引っ張りました。悪い私のログからipが消えました。誰にも良い結果をもたらす改善やその他の提案はありますか?

一般的なアイデアは次のとおりです。

  1. ログファイルからのみIPを抽出する
  2. 並べ替え
  3. ユニークで数える
  4. 並べ替えてください

そしてオーケストラ:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

答え1

私はいつもこれを使います:

tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1

tail実際にどれだけ戻りたいかという制限を設定できます。 (何らかの理由で)ログローテーションを使用しない場合は問題ありません。 2番目に使用しています。awkほとんどのログはスペースで区切られているため、通過しています。追加適切な変数を使用すると、追加情報(訪問したURL、ステータス、ブラウザなど)を抽出できます$。最後に、uniq接触ペアでのみ機能する欠陥があります。つまり:

A
A
A
A
B
A
A

生産します:

4 A
1 B
2 A

希望の出力ではありません。したがって、最初の列(この場合はipsですが、他の列も並べ替えることができます)を並べ替えてから並べ替え、uniq最後に最も高い違反を見るために数を昇順に並べ替えます。

答え2

再創造しているようですね。失敗2禁止ホイール。

Fail2banを見てください。すでにお客様の要件を満たすことができますが、そうでない場合は、簡単にカスタマイズできます。

答え3

Marco Ceppiがawkより良いツールであるという点では正しいですが、awkもawksortよりも優れたツールです。uniqその理由は、そのロジックをawk1000行だけ従う場合には大きな違いはありませんが、望む場合は。膨大な量のGB単位のログファイルを見てくださいawk

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n必要な作業を行いますが、大容量ファイルの場合ははるかに高速です。 IP アドレスをキーに、IP 発生回数を値として awk に IP 配列を作成します。

速度が上がった理由は、awkがデータを一度だけ渡し、ほとんどの操作を実行するためです(最終出力ソートを除く)。別のアプローチでは、トランスポートログに1,000,000の行がある場合、awkは対応する1,000,000の行を読み取り、1,000,000のIPをエクスポートし、1,000,000のIP全体をソートし、現在整列している1,000,000のIPをuniq値に減らします。ソート前のデータ量。 1,000,000以上のIPをパイプ/マルチ転送する代わりに、awkはほぼすべてのタスクを一度に実行します。

私のラップトップで5,513,132行のApacheログ(1.1GB)を使用して速度を比較すると、次のようになります。

  • 2メートル45秒cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
  • 0メートル40秒cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n

関連情報