アクセスログの文字化け・月末処理対策する
シェルスクリプトと cgi

==========================================
webalizerが作成する月別ページの日本語コードをシフトJISコードに変換して 別ファイル名にして保存するシェルスクリプト。

cron で毎日 朝 4時に実行させています。
当然、webalizerを使用したapacheのアクセスログの取得と解析は、それまでに 終了させておきます。

webalizer で作成された HTML のファイル名 httpd_log_yyyymm.html
日本語変換後の HTML のファイル名 httpd_log_jpn_yyyymm.html
=========================================

#!/bin/sh
#-----------------------------------------------------------------
#	ログデータのHTMLファイルをコード変換し文字化けを無くす。
#-----------------------------------------------------------------
#
LOGDER=( アクセスログの保存ディレクトリのパス )
N_YEAR=`date +%Y`              # 年
N_MONTH=`date +%m`             # 月
N_DAY=`date +%d`               # 日
#------------------------------------------------
N_YEAR1=`date +%Y`             # 年
N_MONTH1=`date +%m`            # 月
#------------------------------------------------
#   1月1日のときは、 前年の12月にする
if [ $N_MONTH = "01" -a $N_DAY = "01" ]
        then
         # 前年の12月にする
                N_YEAR1=`expr $N_YEAR - 1`
                N_MONTH1="12"
                N_MONTH="12"
  else
    #  各月1日のときは、 前月にする
    if [ $N_DAY = "01" ]
        then
        # 前月にする。
                N_MONTH1=`expr $N_MONTH1 - 1`
                N_MONTH=`expr $N_MONTH - 1`
        # 月の文字数を取得
                Mlenght=`expr length $N_MONTH1`
        # 1月〜9月を、 01月〜09月にする。
        if [ $Mlenght = 1 ]
            then
        # 月の文字の先頭に"0"を付ける。
                N_MONTH1="0"$N_MONTH1
                N_MONTH="0"$N_MONTH
        fi
    fi
fi
#------------------------------------------------------------------------
#   新旧のアクセスログのファイル名を作成する。
#------------------------------------------------------------------------
   # /httpd_log_yyyymm.html
LOGNAME1="/httpd_log_"$N_YEAR1$N_MONTH1".html"
LOGNAME2="/httpd_log_jpn_"$N_YEAR$N_MONTH".html"
#------------------------------------------------------------------------
#	コード変換し、httpd_log_jpn_yyyymm.htmlで書込み。
#------------------------------------------------------------------------
# nkf フルパス指定しないと動作しない。H26.12.09
/usr/local/bin/nkf -s $LOGDER$LOGNAME1 > $LOGDER$LOGNAME2
#/var/www/system/convert.pl\
 $LOGDER$LOGNAME1 > $LOGDER$LOGNAME2
#------------------------------------------------------------------------

=========================================
webalizer が作成する index.html の月別ページのリンク先を日本語変換した ページに置換えて表示する cgi プログラム

アクセスログの文字化け対策をしたページに置換える処理と 月始め( 1日 )の時に前月分を表示するようにする処理の cgi です。
ファイル名 : index_jpn.cgi としています。
=========================================

#!/usr/bin/perl
#----------------------------------------------------------------
#       2日〜翌月1日までは、同じ月とする。
#       12ケ月分の置換ファイル名を自動生成する。
#----------------------------------------------------------------
#
# 今日の年月日の取得
#
($sec, $min, $hour, $day, $mon, $year) = localtime(time);
$todaytime = time;      # 今日の時間データ
$mon++;                 # 1月のデータが 0 なので +1 する。
$year += 1900;          # 年を西暦にする。
$mon00 = sprintf ("%02d",$mon);	# mm表記にする。
#
$Log_before_head1 = '<A HREF="httpd_log_';
$Log_before_head2 = '<A HREF="httpd_log_jpn_';
$Log_before_tial = '.html">';
#
# HTMLファイル名
#
$htmlfile = "./index.html";
#----------------------------------------------------
# 置換する文字列の初期値を作成
# 年・月の初期値は、当月の( 年 - 1 ),( 月 + 1 )から
# 置換する文字列を作成します。
#----------------------------------------------------
# 1日は、前月の処理をさせる。
if ($day == 1 ){
      $Yyear = $year - 1;        #  前年
      $Ymonth= $mon;             #  当月
}else{
      $Yyear = $year - 1;        #  前年
      $Ymonth= $mon + 1;         #  翌月
      #  12月は、別処理をさせる。
      if ($mon == 12 ){
          $Yyear = $Yyear + 1;   #  当年
          $Ymonth= 1;            #  1月      
      }
}
#--------------------------------------------------------------
# HEAD の最後に charset=euc-jp 追加する変換文字列を作成する。
# index.htmlの表示エンコードは、euc-jp コードにしないと日本語が
# 文字化けする。
#--------------------------------------------------------------
$Log_before[1] = '</HEAD>';      	# 置換元文字1
$Log_after[1] = '<meta http-equiv="Content-Type"\
 content="text/html; charset=euc-jp"></HEAD>';
#--------------------------------------------------------------
# 前年の(当月 + 1)から 配列変数に変換文字列を作成する。12ケ月分
#--------------------------------------------------------------
for $i ( 2 ..13 ) {
    #
    &Year_month();       # サブルーチンのコールする。
    #
    $Log_before[$i] = $M_before;       # 置換元文字
    $Log_after[$i] = $M_after;         # 置換先文字
}
#-------------------------------------------------------------
#       HTMLファイルの読込 ない時には、エラー終了する。
#-------------------------------------------------------------

  if (!open(HTML, "$htmlfile")) {
      print "<HTML><H1>$htmlfileが見つかりません。\
 <H1></HTML>\n";
      exit(0);
  }
	@html = <HTML>;
	close(HTML);
#--------------------------------------------------------------
#       index.htmlの文字列を置換する。
# ex.
# <A HREF="httpd_log_201306.html"><FONT SI……
#           ↓   ↓   ↓   ↓   ↓
# <A HREF="httpd_log_jpn_201306.html"><FONT SI……
#--------------------------------------------------------------
print "Content-type: text/html\n\n";
foreach $html (@html) {
  $html =~ s/$Log_before[1]/$Log_after[1]/gi;   # </HEAD>へ
                                                # charset=euc-jp追加
  $html =~ s/$Log_before[2]/$Log_after[2]/gi;   # 11ケ月前
  $html =~ s/$Log_before[3]/$Log_after[3]/gi;   # 10ケ月前
  $html =~ s/$Log_before[4]/$Log_after[4]/gi;   # 9ケ月前
  $html =~ s/$Log_before[5]/$Log_after[5]/gi;   # 8ケ月前
  $html =~ s/$Log_before[6]/$Log_after[6]/gi;   # 7ケ月前
  $html =~ s/$Log_before[7]/$Log_after[7]/gi;   # 6ケ月前
  $html =~ s/$Log_before[8]/$Log_after[8]/gi;   # 5ケ月前
  $html =~ s/$Log_before[9]/$Log_after[9])/gi;  # 4ケ月前
  $html =~ s/$Log_before[10]/$Log_after[10]/gi; # 3ケ月前
  $html =~ s/$Log_before[11]/$Log_after[11]/gi; # 2ケ月前
  $html =~ s/$Log_before[12]/$Log_after[12]/gi; # 前月
  $html =~ s/$Log_before[13]/$Log_after[13]/gi; # 当月
	print "$html";
}
exit;
#--------------------------------------------------------------
# &Year_month 月の文字列を頭スペースの2文字する。
# 初めてコールするときに$Yyea,$Ymonthに初期値を設定する。
# IN  : $Yyear : 年 $Ymonth : 月
# OUT : $Year_month : 年月(yyyymm)の文字列
# 置換元・置換先文字列の作成
#--------------------------------------------------------------
sub Year_month {
 if ( $Ymonth > 12) {
        $Ymonth = 1;
        $Yyear++;
        $Ymon00 = sprintf ("%02d",$Ymonth); # mm表記にする。
	$Year_month = $Yyear.$Ymon00;
 } else {
        $Ymon00 = sprintf ("%02d",$Ymonth); # mm表記にする。
	$Year_month = $Yyear.$Ymon00;
 }
        $Ymonth++;                     # +1 して翌月にする。
   # 置換元文字
 $M_before = $Log_before_head1.$Year_month.$Log_before_tial;
   # 置換先文字
 $M_after = $Log_before_head2.$Year_month.$Log_before_tial;
return ;
}
#--------------------------------------------------------------
# 終了