どのページが閲覧されたかを知る(4)

前述したアクセスログ解析方法では、ホームページが閲覧された回数が表示される方法がバラバラであるため、あまりわかりやすくありませんでした。 ここでは、解析結果をわかりやすくするために、並び替えて表示する方法を説明したいと思います。

アクセスログ解析結果を並び替える(ソートする)

解析結果を並び替えるには、perlのsortを利用します。 sortは、指定した条件に応じて変数を並び替えてくれます。 ここでは、ページ閲覧回数で並び替えを行いたいと思います。

以下に、perlスクリプトのサンプルを示します。 前述した例との違い部分は強調してある部分です。


#!/usr/bin/perl

# (注意)/usr/bin/perlの部分は必要に応じて変更してください。

# (注意)"access_log.txt"は解析するアクセスログのファイル名に
#  変更してください。
open(LOGFILE, "access_log.txt") || die $!;

# 一行ずつアクセスログファイルを読みます。
while (<LOGFILE>) {

  # perlのパターンマッチを行っています。
  # $1,$2,...$9にマッチした結果が入ります。
  /^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"/;

  # HTTP STATUSが200でないものは除外します
  # 200はOK(成功)を示します
  $httpstatus = $6;
  if ($httpstatus != 200) {
    # 以後の処理は行わず、もう一度while文の最初に行きます
    next;
  }

  # パターンマッチの結果を変数に代入しています。
  $httprequest = $5;

  # スペースで区切ります
  @cols = split(" ", $httprequest);

  # とりあえず、今回のサンプルではGETだけ気にします
  # cgiに関して調べたいときなどには必要に応じてPOSTなどにも対応して下さい

  if ($cols[0] eq "GET") {

    # 2つ目のデータにリクエストされたURLが入っています
    $url = $cols[1];

    if ($url =~ /\.html$/ || $url =~ /\/$/) {
      # URLがHTMLファイルやindexの場合だけ連想配列の値を増やします
      $urlcount{$url}++;
    }
  }
}
close(FILE);

# 連想配列に覚えさせたページビュー数を表示します
# $keyには、URLが入っています
# $urlcount{$key}には、ページビュー数が入っています

foreach $key (sort {$urlcount{$a} <=> $urlcount{$b}}
                keys %urlcount) {
  print $urlcount{$key};
  print "\t$key\n";
}

exit;

上記サンプルは、表示回数の少ない順にソートを行っています。 表示回数の多い順にソートを行いたい場合には、foreach部分の$aと$bを入れ替えれて下さい。 具体的には、foreach部分を以下のように変えてください。


foreach $key (sort {$urlcount{$b} <=> $urlcount{$a}}
                keys %urlcount) {
  print $urlcount{$key};
  print "\t$key\n";
}

sortの後に来ている「{}」内の条件を変更することにより、複雑な条件でのsortも可能です。 多い順、少ない順以外の方法で並び替えを行いたい場合には、色々試してみてください。


IPv6基礎検定

YouTubeチャンネルやってます!