学生実験1-2 : シェルスクリプトと gnuplot






更新情報
  • [2006-04-20] 昨年度の資料をベースに,説明を修正/加筆しました.
  • [2006-04-27] 提出期限を更新しました.







実験の進め方

内容と達成目標

今回のテーマ「シェルスクリプトとgnuplot」では,「そもそもそんなコマンドがあること自体知らなかった」「作業を自動化するためのポインタが分からなかった」等の理由でこれまで機械的な作業を手作業でやっていた仕事(の一部)を自動化する事が目標です.具体的には以下の通り.

  • 達成目標1:シェル(sh/bash)上での正規表現を理解し,使えるようになる.
  • 達成目標2:シェルで繰り返し作業を使えるようになる.
  • 達成目標3:シェルで簡単なログ解析をスクリプトで組み,その結果を gnuplot で図作成できるようになる.

コメント

今回の内容に限らず,講義/実験でやった内容は何らかの形でサマリや例題を残す等して,忘れたときに「ここを見れば分かる!」というノートを作成するようにしましょう(今回の実験では,作成したスクリプト内に適切にコメントを書いておけば,そのときとある動作をどのように実現したのかが分かり,作業記録としても使えます).

また,適宜参考文献や google を駆使し,様々な利用例を読み,実行しなくては自由自在に操れるようにはなれません. シェルスクリプトに限らず,Perl/PHP/Ruby/Pythonなど,様々なスクリプト言語がありますので,時間のあるときにでもそれらについても調べてみてください.

進め方
  • テキスト・補助教材:本ページや参考文献参照(今回からサンプルソースもあります)
  • 作業スタイル:個人作業(1人1レポート)
評価基準

レポートでは指定した課題をこなしている(提出している)事を前提に基準点を設け,以 下の項目に沿って加点・減点を行う.

加点
  • 実験中に示した手法ではなく,自力で探し出した異なる手法で問題を解決した場合(積極性・実践性・創造性).
  • 手法の利点・欠点や限界等に関して自主的にトライした結果・考察が示されている場合(積極性・専門性).
減点
  • 論理的矛盾が見られる場合(論理性).
  • 結果を示さずに考察のみを記載してたり,結果に対する考察に整合性が見られない場合(コミュニケーション能力).
  • タイプミスや可読性の欠如,数式等記号の印字ミス,提出期限の遅れ等,多方面に関して大きな誤りではない場合.

課題と提出方法
  • 1人1レポート提出.
  • 全ての Level にトライし,レポートとしてまとめよ.ただし,Level 4 は 4.3 のグラフ作成(1つ)までを必須とする.
  • 本文とは分けて表紙を作成する事.表紙には以下の項目を記述すること.
    • 課題番号,タイトル,担当教員名
    • 氏名,学籍番号
    • 実験日,提出期限日,提出した日
  • レポートは LaTeX で作成し,印刷物を提出すると共に,作成したスクリプト一式を以下の場所に保存すること.

    以下は ~/jikken1/shell/ に提出物を保存している場合の例です. 修正する場合も同じコマンドで構いませんが,アカウント名(j050xx)を間違えないように注意する事! rsync 自体の説明は例えばここを参照してください.

    % cd   (ホームディレクトリに移動)
    % rsync  -auve  ssh \
         ~/jikken1/shell/ \
         j050xx@naha:/Users/teacher/tnal/jikken2-fri/j050xx/
    % rsync  -auve  ssh \
         ~/jikken1/shell/ \
         j050xx@naha:/Users/teacher/tnal/jikken2-tue/j050xx/
    
  • 提出期限:実験日の10日後までに 705 室へ(4/21のクラスの期限は5/8,4/25のクラスは5/12).


0. 事前準備

  1. X11.appをインストール.
  2. EasyPackageのmath/gnuplotc, graphics/ImageMagickをインストール.必要に応じて japanese/tgif も.

各アプリケーションの説明は参考文献・サイトを参照. また,EasyPackage で扱っている各パッケージの簡易説明はここで参照できます.


1. shell script の基礎

シェルスクリプトの基本は「コマンドを並べる(組み合わせる)事」ただこれだけである. コマンドの並べ方/組み合わせ方は多種多様だが,この辺りは「実際にやってみる」「体験してみる」「既存のソースコードを読んでみる」事でしか学べないものである.

C/Java等のコンパイラ言語で書くほどではないが

  • 日頃良く使う一連のコマンド群をより簡単に実行したい
  • 複数のファイル/ディレクトリに対して同一の処理を実行したい
  • 自動化したい
等,コンピュータにちょっとした仕事をやらせる方法の一つとして「スクリプト言語」を利用したプログラミングがある.具体的な例としては,Perl や PHP を使った WWW 上の掲示板のような目に見えやすいものから,OSの起動処理など,探してみると実に様々な箇所でスクリプト言語が利用されている. 今回はスクリプト言語の一つである sh (bash) シェルを利用したシェルスクリプトを作成する.



[ 資料 ] Shell と Shell Script by 白土先生資料(課題2まで)

Level 1
上記ページの課題1. レポートにはコメント付きでソースファイルを記載すること.
Level 2
上記ページの課題2. レポートにはコメント付きでソースファイルを記載すること.

2. シェルスクリプトサンプル

[ サンプル ] sample-script.tgz

ダウンロード後,自動解凍されない場合は以下のようにして解凍してください. また,各ファイルの説明は「0Readme.txt」を参照してください.

> tar xvfz sample-script.tgz
(または)
> tar xvf sample-script.tar

2.1 引数の使い方: up2html.sh

  • サンプル内の up2html.sh は,引数を利用して異なる処理を実行するシェルスクリプトの例である.(動作確認用スクリプトなので,echo で実行内容を出力させている)
  • [ 参考 ] いくつか less で覗いてみよう!
    • (Linux系OS)デーモン起動時にも case を用いたスクリプトを利用しており,Linux系OS(e.g., pw/nirai/kanai/naha) では /etc/rc.d/init.d/ にある.
    • (Mac OS X)

2.2 サムネイル生成

  • thumbnail1.sh: SUFFIX で指定した拡張子を持つ画像ファイルをリストアップ.
  • thumbnail2.sh: SUFFIX で指定した拡張子を持つ画像ファイルを表示するHTMLファイルを生成.
  • thumbnail3.sh: SUFFIX で指定した拡張子を持つ画像ファイルの縮小画像を生成し,表示するHTMLファイルを生成.
Level 3
thumbnail3.sh をベースに,1ページ内に納める写真数(photo_num)を指定し,自動的にページ分割するように拡張せよ.(下表参考)

photo_numpagename (photos)
photo_num=1
  • page1.html (photo1)
  • page2.html (photo2)
  • page3.html (photo3)
  • page4.html (photo4)
  • page5.html (photo5)
photo_num=2
  • page1.html (photo1, 2)
  • page2.html (photo3, 4)
  • page3.html (photo5)
photo_num=3
  • page1.html (photo1, 2, 3)
  • page2.html (photo4, 5)


2.3 ログ解析

解析ファイル:ダウンロードした sample-script 内にある log/access_log を利用せよ.

httpd へのアクセスログは /var/log/httpd/ にあり,最新は access_log である.

access_log には「アクセス先IP,時刻,メソッド,リクエストのステータスコード」等が含まれている(参考:Apache 1.3 ドキュメント).

このアクセスログを下記の要領で解析するためのシェルスクリプトを作成せよ.

Level 4.1
access_log に記載されているアクセス総数をカウントせよ.

[Tips] man wc

Level 4.2
日毎のアクセス数,IP毎のアクセス数をカウントせよ.

[Tips] man grep, man uniq

Level 4.3
Level 4.2 で求めたカウント数を棒グラフ作成せよ(何れか一つを必須とし,残りはオプションとする).
  • 日毎アクセス数:横軸日付,縦軸アクセス数
  • IP毎アクセス数:横軸IP,縦軸アクセス数(アクセス数トップ10のみで良い)

[Tips] man cut, man tr, man uniq, man sort
[Tips] gnuplot による自動グラフ生成:log/log_anaysis1_comment.sh

# ファイル「sample.dat」に日毎アクセス数を記載してある場合
echo 'set terminal png' > daily.gnuplot
echo 'set output "daily.png"' >> daily.gnuplot
echo 'set title "Daily access log"' >> daily.gnuplot
echo 'set xlabel "Date (2004)"' >> daily.gnuplot
echo 'set ylabel "Access rate"' >> daily.gnuplot
echo 'plot "sample.dat" using 2:1 with boxes' >> daily.gnuplot

gnuplot < daily.gnuplot

Level 4.4(オプション)
日毎アクセス数の中で最もアクセ数の多かった日について,時間あたりのアクセス数推移図を作成せよ.
Level 4.5(オプション)
Level 4.1-4.4 について,結果をHTMLファイルとして出力せよ.
Check points, options
  • 任意のファイル名について実行出来るか?
  • 任意の日付について実行出来るか?
  • pw にてリアルタイムで解析するにはどうすれば良いか?
  • pw にてバッチ処理(一日毎に解析など)するにはどうすれば良いか?


参考文献・サイト

sh(bash)スクリプト
tgif / gnuplot関連