• このエントリーをはてなブックマークに追加

【linux豆知識】dateコマンドで桁を合わせる方法

  • このエントリーをはてなブックマークに追加

linux
zaco muraです。

時刻を扱うシェルスクリプトを作る時にありがちなんですが、月が変わった時とか年が変わった時(まさに今)にうまく動かないということがあります。そんなあるあるネタの回避方法を書きたいと思います。

月初になぜかツールが動かない

私の経験ですが20日くらいに作ったツールが翌月1日になると急に動かなくなるということがありました。原因はシンプルで月をまたぐことにより日付の桁が変わったことでした。
どういうことかと言うと、

# date -d "2015-12-20 00:00:00"
Sun Dec 20 00:00:00 JST 2015

という表示に合わせて時刻を見る(時刻をgrepする)ように作ったところ、月をまたぐと

# date -d "2016-01-01 00:00:00"
Fri Jan  1 00:00:00 JST 2016

というように、月と日の間のスペースの数が変わる(1桁の時はスペースが2つになる)ためgrepが引っかからなくなります。
これを避けるためにフォーマットを指定すると、今度は

# date -d "2016-01-01 00:00:00" "+%a %b %d %H:%M:%S"
Fri Jan 01 00:00:00

みたいな感じで”0″で桁を埋められてしまいます。これでもやはりうまく行きません。

解決方法

実はフォーマットの指定方法を変えることで、桁を合わせる文字をスペースに変えられます。具体的にはこんな感じです。

# date -d "2016-01-01 00:00:00" "+%a %b %_d %H:%M:%S"
Fri Jan  1 00:00:00

うまくスペースが入りました。違いは、フォーマットで “%_d” のように、間にアンダースコアを入れることです。これでスペースで埋めてくれます。
ちなみに、2桁の時は

# date -d "2015-12-20 00:00:00" "+%a %b %_d %H:%M:%S"
Sun Dec 20 00:00:00

このようにスペースは1個になります。

他の方法:桁合わせをしない

そもそも、桁を埋めないようにする(常にスペースを1個にする)こともできます。

# date -d "2016-01-01 00:00:00" "+%a %b %-d %H:%M:%S"
Fri Jan 1 00:00:00

# date -d "2015-12-20 00:00:00" "+%a %b %-d %H:%M:%S"
Sun Dec 20 00:00:00

今度は”-“を使います。

まとめ

以上、dateコマンドを使ってシェルスクリプトを作る時の工夫でした。
また、他にもunixtimeを使うことで月またぎを意識しないように作ることもできます。過去記事:【linux豆知識】unixtime活用方法

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link