0

特定のリンクにアクセスした回数をカウントする目的で/redir、ファイルがさまざまな静的アドレスを他のアドレスにリダイレクトするWebサイト上のディレクトリがあります。.htaccessそのデータを数えるのに役立つスクリプトを書きたいと思います。

すでに2つのスクリプトがあります。access.log.01つ目は、cronジョブを介して毎日午前2時頃にファイルからlog.totalファイルにデータを追加します。2つ目は、最小日付と最大日付を指定して、インタラクティブに実行してカウントを生成できるスクリプトです。

cronスクリプト:

#!/bin/bash
rm -f log.tmp
grep "GET /redir/.*" access.log.0 | cut -d " " -f4,5,7 > log.tmp
cat log.tmp >> log.total
rm log.tmp

これにより、次のようなデータが生成されます。

[21/Aug/2012:00:31:27 -0700] /redir/abc.html
[21/Aug/2012:00:31:35 -0700] /redir/def.html
[21/Aug/2012:00:31:35 -0700] /redir/abc.html
[21/Aug/2012:00:31:40 -0700] /redir/ghi.html
[21/Aug/2012:00:31:46 -0700] /redir/123.html
[21/Aug/2012:00:31:58 -0700] /redir/def.html
[21/Aug/2012:00:32:07 -0700] /redir/abc.html
etc...

readLogs.sh "log.total" "1 week ago" "today"ここで、 1週間前から今日までの間に各ファイルにアクセスした回数をカウントするスクリプトを使用して実行できるようにします。

私はその仕事をする私のスクリプトを以下に投稿しましたが、そこに概説されているいくつかの制限があります。出力は、任意の読み取り可能な形式にすることができます。

4

2 に答える 2

1

範囲を比較するために、日付をUNIXタイムスタンプに変換すると簡単になります。それらを2番目のフィールドとしてファイルに追加できます。

[21/Aug/2012:00:31:27 -0700] 1345534287 /redir/abc.html

(UNIXタイムスタンプは、を使用して取得できますdate +%s --date "date string"。人間が読める形式のタイムスタンプを保持したいと思いますが、必要に応じてタイムスタンプに置き換えることができます。)

これは、ログファイルが提案どおりに変更されていることを前提とした変更されたスクリプトです。スクリプトはまた、bashパラメーター展開を使用して少し短くします。

[更新:終了タイムスタンプに達すると終了するように変更されました。]

#!/bin/bash

# :- means to use the RHS if the LHS is null or unset
FILE="${1:-log.total}"  
MINTIME="${2:-1 day ago}"
MAXTIME="${3:-now}"

START=$( date +%s --date "$MINTIME" )
END=$( date +%s --date "$MAXTIME" )

# No need for cut; just have awk print only the field you want
# Field 1 is the date/time
# Field 2 is the timezone
# Field 3 is the timestamp you added
# Field 4 is the path
awk -v start=$START -v end=$END '$3 > end { exit } $3 >= start {print $4}' "$FILE" | \
  sort | uniq -c | sort
于 2012-08-21T16:57:12.660 に答える
0

これが私が思いついたスクリプトです。制限は、入力された日付がログに表示されない場合、正しく機能しないことです。たとえば、開始日として「1日前」と入力したが、昨日からのアクセスがなかった場合、カウントを開始する場所としてファイルの先頭が選択されます。

#!/bin/bash

if [ "$1" ]; then
FILE="$1"
else
FILE="log.total"
fi

#if test -t 0; then
#INPUT=`cat $FILE`
#else
#INPUT="$(cat -)"
#fi

if [ "$2" ]; then
MINTIME="$2"
else
MINTIME="1 day ago"
fi

if [ "$3" ]; then
MAXTIME="$3"
else
MAXTIME="now"
fi

START=`grep -m 1 -n $(date --date="$MINTIME" +%d/%b/%Y) "$FILE" | cut -d: -f1`
if [ -z "$START" ]; then
START=0
fi

END=`grep -m 1 -n $(date --date="$MAXTIME" +%d/%b/%Y) "$FILE" | cut -d: -f1`
if [ -z "$END" ]; then
END=`wc "$FILE" | cut -d" " -f3`
fi

awk "NR>=$START && NR<$END {print}" "$FILE" | cut -d" " -f3 | sort | uniq -c | sort

出力は次のようになります。

    1 /redir/123.html
    1 /redir/ghi.html
    2 /redir/def.html
    3 /redir/abc.html
于 2012-08-21T15:21:12.790 に答える