web-dev-qa-db-ja.com

日付範囲に基づいてログファイルエントリをフィルタリングする

サーバーのCPU使用率が異常に高くなっており、Apacheが非常に多くのメモリを使用していることがわかります。私は単一のIPでDOSを受けていると感じています-多分あなたは彼を見つけるのを手伝ってくれるでしょうか?

次の行を使用して、最もアクティブな10個のIPを見つけました。

cat access.log | awk '{print $1}' |sort  |uniq -c |sort -n |tail

上位5つのIPには、「平均的な」ユーザーの約200倍のサーバーへのリクエストがあります。ただし、これら5人が非常に頻繁に訪問するのか、それともサーバーを攻撃しているのかはわかりません。

上記の検索を時間間隔に指定する方法はありますか?過去2時間OR今日10-12の間?

乾杯!

2011年10月23日更新-必要なコマンド:

過去X時間以内にエントリを取得[ここ2時間]

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print Date FS $4}' access.log

過去X時間以内に最もアクティブなIPを取得[ここ2時間]

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $1}' access.log | sort  |uniq -c |sort -n | tail

相対的な期間内にエントリを取得する

awk -vDate=`date -d'now-4 hours' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print Date FS Date2 FS $4}' access.log

絶対期間内にエントリを取得する

awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $0}' access.log 

絶対時間内に最もアクティブなIPを取得

awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $1}' access.log | sort  |uniq -c |sort -n | tail
35
sqren

はい、これを行うには複数の方法があります。これは私がこれについてどうするかです。まず、catの出力をパイプする必要はなく、awkでログファイルを開くだけです。

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' access_log

日付がフィールド4に格納され、括弧で囲まれているよりも、ログが私のように見える(設定可能)と仮定します。上記のことは、過去2時間以内にすべてを見つけることです。 Note the -d'now-2 hours'または文字通り翻訳されたマイナス2時間は、私にとっては次のようになります:[10/Oct/2011:08:55:23

だから私は2時間前のフォーマットされた値を保存し、フィールド4と比較しています。条件式は単純である必要があります。次に、Dateを出力し、その後にOutput Field Separator(OFS-この場合はスペース)を続けて、行全体を$ 0とします。前の式を使用して、$ 1(IPアドレス)を出力するだけです

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print $1}' | sort  |uniq -c |sort -n | tail

範囲を使用する場合は、2つの日付変数を指定して、式を適切に作成します。

あなたが2-4時間前に何かを見つけたいなら、あなたの表現はこのように見えるかもしれません

awk -vDate=`date -d'now-4 hours' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date && $4 < Date2 {print Date, Date2, $4} access_log'

ここに、bashの日付に関する役立つ質問があります。 現在の週の月曜日の日付を(bashで)

38
matchew

誰かがawk: invalid -v option、定義済みの時間範囲で最もアクティブなIPを取得するスクリプトを次に示します。

cat <FILE_NAME> | awk '$4 >= "[04/Jul/2017:07:00:00" && $4 < "[04/Jul/2017:08:00:00"' | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20
2