日付の書式をdateコマンドで更新する


アニメ『舟を編む』
辞書が好きです。それが物語になっているってことだけで引きこまれます。映画版もありますね。そちらもまだ見ていないので、まずはアニメから見て、映画版も楽しみにしています。
辞書作りに向いてる人材探しから始まります。言葉をいろんな角度から考えることができる主人公。案外早く見つかってしまいます。社交的ではない主人公は元々営業をやってたので適職とは言えなかったですが、辞書作りに引っ張られて、ようやく天職に巡りあったわけです。同時にパートナーも見つかるのでしょうか。仕事物とばかり思ってましたが、ヒロインが出てきたので恋愛要素もあるんですね。主人公はかなり奥手。デートもしたことがなさそうです。
ところでデートはdate、つまり日付なのですが、なんでデートの意味になっているんでしょうか。こういう時こそ、辞書を引いてみます。手元に広辞苑第六版(8000円ぐらい)があります。分厚い辞書の紙をめくるのも楽しみの一つです。
ありました!1911ページにデートが見つかりました。
「①日付。時日。②日時や場所を定めて異性会うこと。あいびき。」
まあ意味だけです。言葉のルーツまでとなると、やはりインターネットということになるでしょう。

さて、今回はdateコマンドです。
ただ日付だけが列挙されている場合、例えば以下のような日付だけがあるとします。

takk@deb83:~$ for i in `seq 10`;do date +%F --date `expr $RANDOM % 10000`"days 2000-01-01";done | tee days
2020-08-04
2015-12-07
2027-01-06
2010-01-19
2000-07-30
2011-11-13
2000-05-15
2019-02-28
2000-05-31
2002-10-18
takk@deb83:~$ 

これらの日付の曜日が分からない時は、再度dateにかけてやれば良いです。
(%a)の括弧は全角です。

takk@deb83:~$ for i in `cat days`;do date +%x(%a) --date $i;done
2020年08月04日(火)
2015年12月07日(月)
2027年01月06日(水)
2010年01月19日(火)
2000年07月30日(日)
2011年11月13日(日)
2000年05月15日(月)
2019年02月28日(木)
2000年05月31日(水)
2002年10月18日(金)
takk@deb83:~$ 

では、これを何に活用すれば良いか、ということ、ん〜。辞書の紙をめくるのが楽しいと言っている私なので、活用は二の次なのですよね。gitで無理やり使ってみましょう。gitのログもこの書式にしたければ、dateにかけ直してやれば良いです。

git logですが、まず、format指定で一行表示します。

takk@deb83:~/bread$ git log --pretty=format:"%ad %s"
Sun Oct 30 22:33:08 2016 +0900 ATtiny2313 - TC1602E-13A(4BIT MODE)
Sat Oct 29 11:23:53 2016 +0900 s/test/hello/g
Fri Oct 28 21:31:19 2016 +0900 ATtiny2313 - 7SEG 4DIGIT
Thu Oct 27 00:15:29 2016 +0900 ATtiny2313 - 7SEG LED cathode common
Wed Oct 26 00:13:26 2016 +0900 ATtiny2313 - A-3880EG
Mon Oct 24 11:40:39 2016 +0000 ATtiny26
Sun Oct 23 22:36:39 2016 +0900 ATtiny2313 - TC1602E-13A
Sat Oct 22 21:31:36 2016 +0900 oops
Sun Oct 16 16:43:30 2016 +0000 ATtiny85
Sat Oct 15 22:32:29 2016 +0900 ATtiny2313
Mon Oct 10 20:42:46 2016 +0900 diet
Wed Oct 5 00:46:25 2016 +0900 label
Tue Oct 4 00:21:57 2016 +0900 pin header and sample
Mon Oct 3 21:10:20 2016 +0900 oops! #1
Mon Oct 3 00:05:20 2016 +0900 first commit

–date=shortで、日付を完結に。上のコマンドの時点で、曜日は表示されていますが、dateコマンド使いたいのであえて消します。(本末転倒)

takk@deb83:~/bread$ git log --pretty=format:"%ad %s" --date=short
2016-10-30 ATtiny2313 - TC1602E-13A(4BIT MODE)
2016-10-29 s/test/hello/g
2016-10-28 ATtiny2313 - 7SEG 4DIGIT
2016-10-27 ATtiny2313 - 7SEG LED cathode common
2016-10-26 ATtiny2313 - A-3880EG
2016-10-24 ATtiny26
2016-10-23 ATtiny2313 - TC1602E-13A
2016-10-22 oops
2016-10-16 ATtiny85
2016-10-15 ATtiny2313
2016-10-10 diet
2016-10-05 label
2016-10-04 pin header and sample
2016-10-03 oops! #1
2016-10-03 first commit

これをperlでフィルタリングしますが、perlのsystem関数使うと、コマンドの成功値(0)が帰ってくるので、最後に縦棒に置換してます。
そしてENDで改行を入れています。

takk@deb83:~/bread$ git log --pretty=format:"%ad %s" --date=short | perl -pe 's/^([\d-]+)/system("echo -n `date +%x(%a) --date \"$1\"`")/e;s/0 /|/;END{print"\n"}'
2016年10月30日(日)|ATtiny2313 - TC1602E-13A(4BIT MODE)
2016年10月29日(土)|s/test/hello/g
2016年10月28日(金)|ATtiny2313 - 7SEG 4DIGIT
2016年10月27日(木)|ATtiny2313 - 7SEG LED cathode common
2016年10月26日(水)|ATtiny2313 - A-3880EG
2016年10月24日(月)|ATtiny26
2016年10月23日(日)|ATtiny2313 - TC1602E-13A
2016年10月22日(土)|oops
2016年10月16日(日)|ATtiny85
2016年10月15日(土)|ATtiny2313
2016年10月10日(月)|diet
2016年10月05日(水)|label
2016年10月04日(火)|pin header and sample
2016年10月03日(月)|oops! #1
2016年10月03日(月)|first commit
takk@deb83:~/bread$ 

こうして見ると、先週一週間毎日コミットしてたんですね。モチベーションがあったということでしょうか。角度を変えるといろいろ見えてきますね。

One response to “日付の書式をdateコマンドで更新する

  1. Pingback: PowerShell(日付時刻の計算) | コマンドの達人

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA