だから私は集めて引っ張りました。悪い私のログからipが消えました。誰にも良い結果をもたらす改善やその他の提案はありますか?
一般的なアイデアは次のとおりです。
- ログファイルからのみIPを抽出する
- 並べ替え
- ユニークで数える
- 並べ替えてください
そしてオーケストラ:
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
その理由は、そのロジックをawk
1000行だけ従う場合には大きな違いはありませんが、望む場合は。膨大な量の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