タグ・アーカイブ: bash

こんばんわ。リアル引越で荷造荷解がクソ忙しいのに、ヤフオクでNetScreen 5GTとCisco 2950を2台ずつ落札した (っ´∀`)っ ゃー です。まだイーモバしか回線ないのに、何やってんでしょね。

さて、相変わらずの小ネタですみません。calコマンドの出力結果を使って、1年が何日あるかを算出する、あまり需要のなさそうなスクリプトです。まずは2000年から2010年までの出力結果から。

2000 year is 366 days.
2001 year is 365 days.
2002 year is 365 days.
2003 year is 365 days.
2004 year is 366 days.
2005 year is 365 days.
2006 year is 365 days.
2007 year is 365 days.
2008 year is 366 days.
2009 year is 365 days.
2010 year is 365 days.

ちゃんと、閏年が366日になっていますね。

calコマンドに引数をつけずに実行するとこんな感じ。

$ cal
      May 2009
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

年単位で引数をつけると

$ cal 2009
                               2009

       January               February                 March
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
             1  2  3    1  2  3  4  5  6  7    1  2  3  4  5  6  7
 4  5  6  7  8  9 10    8  9 10 11 12 13 14    8  9 10 11 12 13 14
11 12 13 14 15 16 17   15 16 17 18 19 20 21   15 16 17 18 19 20 21
18 19 20 21 22 23 24   22 23 24 25 26 27 28   22 23 24 25 26 27 28
25 26 27 28 29 30 31                          29 30 31

・・・(略)

等幅フォントじゃないと崩れますが、まあこんな風になります。
というわけで、年と月と曜日と空行をegrepで除いてやって、wcコマンドで単語の数を数えてやれば、おのずと答えは見えてきます。

試しに今年が何日あるかを見てみましょう。

$ cal 2009 | egrep -v "(2009|[a-zA-Z]|^$)" | wc -w
365

今まで空行を除くのに

$ cal 2009 | egrep -v "(2009|[a-zA-Z]" | egrep . | wc -w

なんてやってたけど、正規表現で空行を「^$」としてやったら、egrepをわざわざ2回使わずに済む!たかだか10年ぶんだったらともかく、100年ぶんとか繰り返すとなると、実行速度に差が出るでしょう。ちょっとした工夫マンセー!

というわけで、こんな風に作ってみました。

$ cat ./bin/datescount.sh
#!/bin/sh
for i in `echo {2000..2010}`
do
echo "$i year is `cal $i | egrep -v "($i|[a-zA-Z]|^$)" | wc -w` days."
done

ね、簡単でしょ?

あるテストツールをブン回しているときのCPU使用率とメモリ使用率を算出したいと言われまして、時刻とCPU使用率とメモリ使用率を出すスクリプトを書きました。計測結果は1時間ごとのログを取るようにしています。参考にしたページはココココです。

#!/bin/sh
LANG=C
while true
do
    top -n 1 -b -d 1 | grep ^Cpu |
    sed -e "s/^/`date`t/g;s/$/tmemory free is `free -t |
    grep -i ^total | awk '{print int( (1-($3/$2))*100 )}'`%/g" >> `date +%Y%m%d-%H`.log
    sleep 1
done

今回のスクリプトは単純にtopコマンドとfreeコマンドの結果を同じ1行に出力したいと思ったわけで作成したのです。整形の部分はsedコマンドが大活躍ですね。topコマンドですが、そのまま実行するにはちょっと不都合です。なので、繰り返し回数を-nオプションで指定します。秒間1回ずつの出力をしたいので、-nオプションの引数に1を与えて、1回ずつの出力をwhile文で繰り返すことにしました。そして、CPU使用率の出力をsedコマンドで置換し、行頭に日付を、行末にメモリ使用量をつけくわえます。日付、CPU使用率、メモリ使用率の各項目はTABで区切ってやることにしました。

topコマンドの出力結果ですが、これはサマリーエリアに表示されているCPU使用率の部分をgrepで切り出しています。左から、ユーザプロセスの使用時間が1%、システムプロセスの使用時間が1%、実行優先度を変更したユーザプロセスの使用時間が0%、アイドル状態の時間が98%、I/Oの終了待をしている時間、ハードウェア割込み要求での使用時間、ソフトウェア割込み要求での使用時間がそれぞれ0%となっています。つまり、CPUの空きは98%ということになります。

Cpu(s):  1.0% us,  1.0% sy,  0.0% ni, 98.0% id,  0.0% wa,  0.0% hi,  0.0% si

freeコマンドの出力結果ですが、-tオプションをつけることで、実メモリとswapとの合計を出すことにしました。この出力結果のTotalで始まる行がそれです。その後の

awk '{print int( (1-($3/$2))*100 )}'

の部分で、メモリの空き領域をメモリ容量合計で割った結果を百分率の形に計算しています。ほんとに簡単な負荷計測ツールとして使うには、これでいいんじゃないかなー・・・と思います。

※ 2008/07/19 追記
PHPでもっと凄いスクリプト書いてる人発見 (*゚Д゚) ムホムホ

暇つぶしの勢いで作った。後悔はしていない。どれもアホっぽいとか言うの禁止な。

#!/bin/bash
# 3のつく数字と3の倍数でアホになるスクリプト

# 40まで数える
for i in `echo {1..40}`
do
# 数えた数字が3のつく数かどうかをgrepに引っ掛けて判定する
if [ `echo $i | grep 3` ];
    then
        # アホになる
        echo (っ。ω゚)っ<$i
        sleep 1
    else
    # 数えた数字を3で割って余りが出ないか、grepに引っ掛けて判定する
    if [ `echo "scale=1; $i/3" | bc | grep .0` ];
    # 余りが発生しない(3の倍数だ)とアホになる
    then
        echo (っ。ω゚)っ<$i
        sleep 1
    # 3のつく数や3の倍数じゃない数は、普通にカウントする
    else
        echo (っ´∀`)っ<$i
        sleep 1
    fi
fi
done

おーもろー!