分単位で行数をカウントすればいいかと思いますが、
どのようなシェルを作成すればいいか教えてください。
#!/bin/sh
CHOUR=0
while [ "$CHOUR" -lt '23' ]
do
CMIN=0
while [ "$CMIN" -lt '59' ]
do
PREH=`printf %02d $CHOUR`
PREM=`printf %02d $CMIN`
echo "grep '$PREH:$PREM' /apache_log"
grep '$PREH:$PREM' /apache_log > ${PREH}${PREM}_log
CMIN=`expr $CMIN + 1`
done
CHOUR=`expr $CHOUR + 1`
done
exit 0
こんな感じで、分単位に分解できます。
grep の検索ワードをもう少しログの日付形式に近づければ、良いかな、と。
ちなみにログ解析は Perl のが楽な気もします。。。
分の書式がどうなっているか不明なので、手元にある形式で説明します。
以下の例)
127.0.0.1 - - [19/Apr/2007:17:51:02 +0900] "HEAD /error/noindex.html HTTP/1.0" 200 - "-" "Wget/1.9+cvs-stable (Red Hat modified)"
日付の部分を取り出すには
cat accesslog | awk {'print $4 $5 '}
で
[19/Apr/2007:17:36:02+0900] [19/Apr/2007:17:41:02+0900] [19/Apr/2007:17:41:02+0900] [19/Apr/2007:17:46:02+0900] [19/Apr/2007:17:46:02+0900] [19/Apr/2007:17:51:02+0900] [19/Apr/2007:17:51:02+0900] <| こんな感じになるので、あとは、もし分だけであれば さらにこれを >| awk{'FS=":";print $3'} | sort
すれば、
36 41 41 46 51 61
になるので最後はuniq -cします。
手元にあるのでやってみました。
# cat access_log | awk {'print $4$5'} | awk {'FS=":";print $3'} | sort | uniq -c 1 219 06 220 11 220 16 220 21 220 26 220 31 220 36 220 41 220 46 220 51
厳密にはシェルじゃないのですが。
ご回答ありがとうございます。
勉強になります。
ご回答ありがとうございます。
プログラムはまったく分からないので、
頂いた記述をそのまま実行しましたところ、
以下のエラーが表示され、0000_log, 0001_logなどたくさんのファイルが生成されました。
grep: /apache_log: そのようなファイルやディレクトリはありません
grep '01:03' /apache_log
grep: /apache_log: そのようなファイルやディレクトリはありません
grep '01:04' /apache_log
Perlに関しても知識がないのですが、
CPANでApache::ParseLogというのを使おうかと試しましたが、
知識がないため途中で断念しました。
おすすめの方法があればご教示頂けると助かります。