• 検索結果がありません。

-2 gnuplot( ) j ( ) gnuplot /shell/myscript 1

N/A
N/A
Protected

Academic year: 2021

シェア "-2 gnuplot( ) j ( ) gnuplot /shell/myscript 1"

Copied!
16
0
0

読み込み中.... (全文を見る)

全文

(1)

情報工学実験1

-2

・シェルスクリプトと

gnuplot(

當間

)

j

05017

金城佑典

作成日:2006 年 05 月 03 日

提出期限:2006 年 05 月 12 日

提出日:2006 年 05 月 09 日

概 要 情報工学実験1の第2回目(教官:當間先生)の課題「シェルスクリプト とgnuplot」のレポートです。作成したスクリプトは「/shell/myscript」 内にコピーを保管してあります。また問題文は省略してあります。

(2)

1

shell script

の基礎

Level 1 mylsのソース #!/bin/sh #現在のディレクトリを保存 nowdir=‘pwd‘ #引数がファイル名または空白だったら if [ -f $1 -o -z $1 ] ; then

echo "Enter pass" echo "ex) myls.sh ./" exit fi #引数がディレクトリ名なら if [ -d $1 ] ; then dir=$1 cd $dir dir=‘pwd‘ else

echo "Error! --> No Such Directory" exit

fi

file=‘ls -1 | nkf -e‘

#現在のディレクトリと表示中のディレクトリ緑色でを表示 echo -e "\033[40m\033[1;32mNow $nowdir\033[0m" echo -e "\033[40m\033[1;32mViewing $dir\033[0m"

# fileがディレクトリなら青色で表示

for filename in $file do if [ -d $filename ] ; then echo -e "\033[1;34m${filename}\033[0m\1/" fi done # fileがファイルなら白色で表示

(3)

for filename in $file do if [ -f $filename ] ; then echo "${filename}" fi done #元のディレクトリに戻る cd $nowdir mylsの実行結果 図 1: myls 実行結果 指定したディレクトリの内容を表示するスクリプト、相対パスで指定した 場合もどのディレクトリの内容を表示しているかわかるようにした。オプショ ン課題については上図のようにディレクトリへの着色はうまくいったが、オ プション指定ができなかった、getopts 関数の使用法は今後の課題になりそう だ。 Level 2 myupperのソース #!/bin/sh #引数がなかったら if [ -z $1 ] ; then

echo "Error! --> Enter FileName" echo " example) myupper abc.txt" exit

fi

#引数を順番に読み込む for file do

(4)

#引数がファイル名だったら大文字変換の処理 if [ -f $file ] ; then

#変数 ch に tr で大文字に変換した結果を代入 ch=‘echo $file | tr "[a-z]" "[A-Z]"‘ echo "$file ---> $ch"

#mvでファイル名変更

mv $file $ch

#引数がファイル名じゃなかったら else

"Error! --> Enter FileName" exit fi done myupperの実行結果 実行前 %ls Add.dsa asd.dsa das.dsa 実行 %sh myupper.sh *.dsa Add.dsa ---> ADD.DSA asd.dsa ---> ASD.DSA das.dsa ---> DAS.DSA 実行後 %ls ADD.DSA ASD.DSA DAS.DSA 引数で指定したファイルのファイル名を大文字に変換するスクリプト。拡張 子まで大文字に変換されてしまっているがファイルを開くのに支障はなかっ た、しかし気分的に落ち着かないので暇なときに直しておこうと思う。 mymvのソース

(5)

#!/bin/sh

#引数が0だったら使用法メッセージを表示して終了 if [ $# -gt 2 ] ; then

if [ $# -eq 0 ] ; then

echo "Error! --> How to use"

echo " example) mymv.sh after *.before" echo " abc.before -> abc.after"

exit else

echo "Error! --> Enter 2 extension "

echo "If you enter % mymv.sh you can see How to use" fi fi #afterに変換後の拡張子を代入 after=$1 #引数を一つずらす shift list="" #残りの引数を順番に読み込む for koko do #指定されたファイルが無かったらエラーメッセージを表示して終了 if [ ! -f $koko ] ; then

echo "$koko is not found!" exit else #ファイルが存在したら list に代入 list="$list $koko" fi done # listの中身を1つづつ file に代入

for file in $list do

#ファイルから拡張子を抜き出す

(6)

#tofileに拡張子を変更したファイル名を代入する afterfile=‘basename $file $ext‘$after

#ファイル名変換確認 while [ 1 ] do

echo -n "$file ---> $afterfile rename?(yes/no) "

#キーボードから文字を受け取る read ans #受け取った文字に応じて処理する case $ans in ##yes/yとだったらファイル名を変更して終了 yes|y) mv $file $afterfile break ;; ##no/nだったら何もせずに終了 no|n) break ;; ##それ以外の文字だったら繰り返す *)

echo "please enter yse or no" continue ;; esac done done mymvの実行結果 実行前 %ls ADD.DSA ASD.DSA DAS.DSA 実行 %sh mymv.sh txt *.DSA

(7)

ADD.DSA ---> ADD.txt rename?(yes/no) y ASD.DSA ---> ASD.txt rename?(yes/no) n DAS.DSA ---> DAS.txt rename?(yes/no) y

実行後 %ls ADD.txt ASD.DSA DAS.txt 指定したファイルの拡張子を変換するスクリプト、好きな拡張子(実行例で は .txt)にも変更することができるがファイルの内容を変換する訳ではない のであまり有効性はないと思われる。拡張子の抜き出し法がまったくわから なかったので先輩のソースを参考にさせてもらった。

2

サムネイル生成

Level 2 thumのソース #!/bin/sh # 引数チェック if [ $# -lt 2 ] ; then

echo "Usage: $0 SUFFIX RESIZE photo_num" echo " RESIZE: percent"

echo " example) thumnail3.sh jpg 30 2" exit fi # リストアップ処理 SUFFIX=$1 RESIZE=$2 photo_num=$3 files=‘ls *.$SUFFIX‘ # 縮小画像生成 ## 縮小画像保存用の一時ディレクトリ生成 DIR=resized if [ -d $DIR ] ; then

(8)

echo " temporal directory ($DIR) exsits..." else

mkdir $DIR

echo " temporal directory ($DIR) CREATED." fi

## 一時ディレクトリに縮小画像を生成

cd $DIR file_num=0

for filename in $files do

convert -resize $RESIZE%x$RESIZE% ../$filename ${filename}_s.$SUFFIX echo "convert $filename to $DIR/${filename}_s.$SUFFIX"

file_num=‘expr $file_num + 1‘ echo $file_num done cd ../ #HTML count_pa=1 # HTML のページ番号 flg=1 # HTML のソースに関係する count_ph=0 # 画像を貼る数に関係する ##何ページになるか計算

page=‘expr $file_num / $photo_num‘ page2=‘expr $file_num % $photo_num‘

if [ $page2 -ne 0 ] ; then page=‘expr $page + 1‘ fi

echo "create $page HTML files"

## HTML ファイル生成

resized_files=‘ ls $DIR/*_s.$SUFFIX ‘ for filename in $resized_files

do

(9)

if [ $flg -eq 1 ] ; then

echo "<html>" > page$count_pa.html echo "<head>" >> page$count_pa.html

echo "<title>page$PAGE.html</title>" >> page$count_pa.html echo "</head>" >> page$count_pa.html

echo "<body>" >> page$count_pa.html flg=0

fi

###画像の出力

echo "<img src=\"$filename\" alt=\"Img$count_ph\" >" >> page$count_pa.html count_ph=‘expr $count_ph + 1‘

echo "$filename --- page$count_pa.html "

if [ $count_ph -eq $photo_num ] ; then flg=1

count_ph=0 fi

###HTMLの終了 1

if [ $flg -eq 1 ] ; then

echo "</body>" >> page$count_pa.html echo "</html>" >> page$count_pa.html echo "created page$count_pa.html " count_pa=‘expr $count_pa + 1‘ fi

done

###HTMLの終了 2(#HTML の終了 1 だけでは最後のページの終了ができないた

め)

echo "</body>" >> page$count_pa.html echo "</html>" >> page$count_pa.html

###もし HTML の終了 2 で余計なファイルが出来てしまったら削除 if [ $count_pa -gt $page ] ; then

(10)

else

echo "created page$count_pa.html " fi

thumの実行結果

sh thum.sh jpg 30 4

temporal directory (resized) CREATED.

convert DSC00030.jpg to resized/DSC00030.jpg_s.jpg 1 convert DSC00057.jpg to resized/DSC00057.jpg_s.jpg 2 convert DSC00076.jpg to resized/DSC00076.jpg_s.jpg 3 convert DSC00149.jpg to resized/DSC00149.jpg_s.jpg 4 convert DSC00160.jpg to resized/DSC00160.jpg_s.jpg 5 convert DSC00204.jpg to resized/DSC00204.jpg_s.jpg 6 create 2 HTML files resized/DSC00030.jpg_s.jpg --- page1.html resized/DSC00057.jpg_s.jpg --- page1.html resized/DSC00076.jpg_s.jpg --- page1.html resized/DSC00149.jpg_s.jpg --- page1.html created page1.html resized/DSC00160.jpg_s.jpg --- page2.html resized/DSC00204.jpg_s.jpg --- page2.html created page2.html 完成した HTML ファイルのサンプル http://www.ie.u-ryukyu.ac.jp/~j05017/ie/jikken/page1.html http://www.ie.u-ryukyu.ac.jp/~j05017/ie/jikken/page2.html 指定した拡張子の画像を縮小し、指定した枚数づつ HTML に出力するスクリ プト、過程を出力することで HTML を開かなくてもどの画像がどのページに 表示されるかわかるようにした。画像を指定された枚数づつ HTML に出力 するのがとても難しかった、フラグ (flg) を立てる条件式を工夫して「HTML の終了 2」を記述せずに済むようにしたかったがうまくいかなかった。

(11)

3

ログ解析

Level 4 logのソース #!/bin/sh

#引数1が空なら if [ -z $1 ] ; then

echo "Enter filename and option" echo "ex) log.sh access_log {ip/day}" exit

fi

#引数2が空なら if [ -z $2 ] ; then

echo "Enter option"

echo "ex) log.sh access_log {ip/day}" exit fi #ログの総数を求める log_count=‘wc -l $1‘ echo "$log_count" ###日毎のアクセス数 if [ $2 = "day" ] ; then #日付のリストを格納するためのファイルを作る touch day_list.dat

chmod u+rwx day_list.dat

#アクセスログから日付を抜き出す

( cut -d ’ ’ -f 4 < $1 | cut -c 2-12 | sort -n | uniq -c ) > day_list.dat cat day_list.dat

#画像を作成

echo ’set terminal png’ > day.gnuplot echo ’set output "day.png"’ >> day.gnuplot

(12)

echo ’set xlabel "Date (2004)"’ >> day.gnuplot echo ’set ylabel "Access rate"’ >> day.gnuplot

echo ’plot "day_list.dat" using 2:1 with boxes’ >> day.gnuplot

gnuplot < day.gnuplot #不要なファイルを消す rm -f day_list.dat rm -f day.gnuplot fi ###IP毎のアクセス数 if [ $2 = "ip" ] ; then #IPのリストを格納するためのファイルを作る touch ip_list.dat chmod u+rwx ip_list.dat

#アクセスログから IP を抜き出す

( cut -d ’ ’ -f 1 < $1 | sort -n | uniq -c ) > ip_list.dat cat ip_list.dat

#画像を作成

echo ’set terminal png’ > ip.gnuplot echo ’set output "ip.png"’ >> ip.gnuplot echo ’set title "IP access log"’ >> ip.gnuplot echo ’set xlabel "IP"’ >> ip.gnuplot

echo ’set ylabel "Access rate"’ >> ip.gnuplot

echo ’plot "ip_list.dat" using 2:1 with boxes’ >> ip.gnuplot

gnuplot < ip.gnuplot

#不要なファイルを消す rm -f ip_list.dat rm -f ip.gnuplot

(13)

fi ###HTML作成 if [ $3 ] ; then echo "<html>" > $3.html echo "<head>" >> $3.html echo "<title>$3.html</title>" >> $3.html echo "</head>" >> $3.html echo "<body>" >> $3.html

echo "<img src=\"$2.png\" alt=\"$2_access_log\" >" >> $3.html echo "</body>" >> $3.html echo "</html>" >> $3.html echo "created $3.html " fi exit logの実行結果 日毎のアクセス数

%sh log.sh access_log day Daily 95 access_log 7 06/Dec/2004 1 08/Dec/2004 76 09/Dec/2004 2 10/Dec/2004 1 13/Dec/2004 2 15/Dec/2004 1 17/Dec/2004 2 21/Dec/2004 3 22/Dec/2004 created Daily.html 完成した HTML のサンプル http://www.ie.u-ryukyu.ac.jp/~j05017/ie/jikken/file/Daily.html IP毎のアクセス数 %sh log.sh access_log ip IP 95 access_log 1 35.10.47.37 3 60.34.136.173

(14)

1 61.116.186.45 2 61.199.170.156 1 61.213.47.211 6 61.78.61.166 1 61.95.54.174 1 64.53.90.33 2 66.196.90.178 1 66.196.90.207 5 66.196.90.59 1 66.196.90.92 1 66.196.91.132 1 66.196.91.175 1 66.196.91.178 1 66.196.91.199 1 66.196.91.202 1 66.196.91.203 2 66.196.91.205 1 66.196.91.206 2 66.196.91.207 2 66.196.91.216 7 66.196.91.239 1 66.196.91.32 1 66.196.91.87 1 68.121.94.147 1 68.143.54.82 4 82.67.110.170 2 82.79.189.243 1 133.13.48.235 1 133.13.48.8 1 133.13.49.18 2 133.13.50.76 1 133.13.52.37 1 133.13.53.122 2 133.13.54.156 2 133.13.54.53 3 133.13.57.226 2 133.95.109.80 1 210.139.250.215 1 210.47.27.36

(15)

1 218.113.200.138 1 218.146.238.174 1 219.160.252.142 5 219.166.179.56 3 220.109.8.237 5 220.110.222.75 3 220.20.70.41 1 220.221.238.133 2 220.221.239.196 created IP.html 完成した HTML のサンプル http://www.ie.u-ryukyu.ac.jp/~j05017/ie/jikken/file/IP.html 任意のログファイルから日毎/ IP アドレス毎のアクセス数を計算しグラフ で表示するスクリプト、以下のような欠点がある 1. ログファイルの書式が「IP アドレス - - [日付:時刻∼ 」でなければな らない 2. 出力されるグラフ(とくに IP)が見にくい 3. 計算範囲を指定する事ができない 特に1と2は問題だと思うが、解決法がまったく思いつかなかった。

4

感想と今後の課題

とても難しい課題だったがたまにはこういうのもいいと思う、しかし出来 る事なら他の講義の課題がない時にだしてほしかった。 今後の課題としてはシェルスクリプトでのオプション指定と TeX 文書での itemboxの使用法があると思う、前者は使いやすいプログラムを作成するた めに必要だし、後者はレポートを見やすくする事ができるが、どちらもなぜ 実行できないのか原因不明なのでいろいろ試してみようと思う。

参考文献

[1] シェルスクリプトと gnuplot http://www.eva.ie.u-ryukyu.ac.jp/ tnal/2006/info1/shell/index.html

(16)

[2] Shellと Shell Script http://www.iis.elec.fuk.kindai.ac.jp/ sira/index.php? [3] UNIXの部屋 http://x68000.q-e-d.net/ 68user/unix/ [4] Bash-Prompt-HOWTO http://www.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO.html [5] Bシェルスクリプトのすすめ http://www.ybi.co.jp/koike/src/BSH.htm.html

参照

関連したドキュメント

・3 号機 SFP ゲートドレンラインからの漏えいを発見 ・2 号機 CST 炉注ポンプ出口ラインの漏えいを発見 3 号機 AL31 の条件成立..

これらの実証試験等の結果を踏まえて改良を重ね、安全性評価の結果も考慮し、図 4.13 に示すプロ トタイプ タイプ B

2 号機の RCIC の直流電源喪失時の挙動に関する課題、 2 号機-1 及び 2 号機-2 について検討を実施した。 (添付資料 2-4 参照). その結果、

Copyright©2021 ITbook Holdings Co.,Ltd.. All

解析結果を図 4.3-1 に示す。SAFER コード,MAAP

・ 総務班は,本部長が 5 号機 SE31

スピーカは「プラントの状況(現状)」「進展予測,復旧戦術」「戦術の進捗状 況」について,見直した 3 種類の

IAEA の個別安全要件 SSR-5 “Disposal of Radioactive Waste”(2011) 73