calコマンドを使って、1年が何日かを算出する

こんばんわ。リアル引越で荷造荷解がクソ忙しいのに、ヤフオクで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

ね、簡単でしょ?