Linuxで一番親切なコマンド~dateコマンドの便利なオプションたち~ | 瀬戸内の雲のように

Linuxで一番親切なコマンド~dateコマンドの便利なオプションたち~

Posted: 2018-05-07


スポンサーリンク

目次

背景

突然ですが、Linuxで一番親切なコマンドは何だと思いますか?私は断然 dateコマンド だと思います。

dateコマンドは様々な「かゆいところに手が届く」オプションが用意された、とても素敵なコマンドなのです。

今回は、そんなdateコマンドの魅力を余すこと無く伝えていきたいと思います。

 

大前提: dateコマンドとは

dateコマンドは時刻を表示するコマンドです。
日本語環境(LANG=ja_JP.UTF-8 など)であれば、以下のような出力結果になると思います。

$ date
2018年  4月 21日 土曜日 11:02:58 JST

はい。見事に現在時刻を表示してくれました。非常に無駄がないですね。

ということで、次から色々なオプションを見ていきましょう。

 

使い方その1. 時刻の表示形式(フォーマット)を変えるオプション

上記の通り、デフォルトでは出力結果が日本語表記になってしまいます。これはこれで嬉しいときもありますが、ツールの連携等を考えると全角文字やスペースは不要だったりもします。

1-1. スペースなし表記

ということで、まずはスペースなしの表記です。

コマンド

date "+%Y%m%d%H%M"

実行結果

201804211102

シンプルな表示結果になりました。

このように、date +"フォーマット"と言うコマンドでフォーマットを指定して表示させることができます。
フォーマットの内容でよく使うのは以下のようなものです。

フォーマット 意味 表示例
%Y 年を4桁で表示 2018
%m 月を2桁で表示 04
%d 日を2桁で表示 21
%H 時刻を2桁・24H形式で表示 11
%M 分を2桁で表示 02
%S 秒を2桁で表示 58

 

1-2. 半角文字で区切る

先程の例はシンプルですが、少し読みづらいかもしれません。ということで、次は半角文字で区切りを入れます。

date "+%Y/%m/%d %H:%M:%S"
2018/04/21 11:02:58

どうでしょうか。少し見やすくなりました。

 

1-3. 言語を指定して表示(英語、日本語)

これでも見やすくなったと思いますが、人間の読みやすさで言うと最初の表示(オプションなし)の方が読みやすいかと思います。

しかしオプション無しの場合、言語設定により表示が異なってしまうため、シェルスクリプト等で使う場合には工夫が必要です。

英語で表示する場合は

LANG="C" date
Mon Apr 21 11:02:58 JST 2018

日本語で表示する場合は

LANG="ja_JP.UTF-8" date

表示は

2018年  4月 21日 土曜日 11:02:58 JST

このようにコマンドの前にLANGで環境変数を指定すれば、このコマンドにだけ有効な環境変数を設定できます。

 

1-4. 0埋め(ゼロパディング)しない

次はもう少し細かい使い方です。例えば月の表示などは1桁の場合と2桁の場合がありますが、この表示形式も変更できます。
デフォルトでは1桁の場合04のように0で埋めて(パディングして)2桁に合わせて表示してくれますが、以下のようにすればそれをやめられます。

コマンド

date "+%Y/%-m/%d"

結果

2018/4/21

上記の通り、%-mのように%と表示内容の間に-を入れれば0埋めをやめてくれます。

 

1-5. 0埋めせず位置も揃える(スペースで埋める)

先の例では0埋めをやめる方法を書きましたが、この場合だと文字の位置がずれる場合があります。(例えば5文字目が月表示の場合と5,6文字目が月表示の場合など)
基本的にあまり問題はないですが、シェルスクリプトにするときに問題になる場合があります。

でもdateコマンドは親切なのでちゃんとそういう場合にも対応できます。_(アンダーバー)を付けることで0の代わりにスペースで間を埋めてくれます。

コマンド

date "+%Y/%_m/%d"

結果

2018/ 4/21

このように表示形式を指定することができます。

使い方その2. 表示する時刻を変える

これまで書いてきた例は基本的に現在時刻を表示していました。
しかしスクリプト等で使う場合には現在時刻以外の時刻を指定したい場合があります。そんな時、dateコマンドはその親切さを十分に発揮してきます。

2-1. 日付・時刻を直接指定

例えば2000年1月1日を指定したい場合は

コマンド

date -d "2000-1-1"

結果

2000年  1月  1日 土曜日 00:00:00 JST

 
また、時刻まで指定したい場合は

date -d "2000-1-1 9:30"

結果

2000年  1月  1日 土曜日 09:30:00 JST

となります。

 
上記のように、-d オプションを使うことで日付や時刻を指定することができます。

ちなみに-dオプションで指定する時刻の形式はある程度ゆらぎを許容してくれます(区切り文字を-にしたり/にしても大丈夫)。

親切ですね~

 

2-2. 現在を起点にした時刻(相対時刻)の指定

先程の例では○年×月△日のように絶対時刻で指定しました。しかしdateコマンドの便利さはここからです。以下の例を見てください。

コマンド

date -d "1 day ago"

結果

2018年  4月 20日 金曜日 11:02:58 JST

 
上記のように1 day agoと指定すると、1日前の日付・時刻を表示してくれます。
この表記ではいくつかの指定が可能です。

週単位

# date -d "1 week ago"
2018年  4月 14日 土曜日 11:02:58 JST

月単位

# date -d "2 month ago"
2018年  2月 21日 水曜日 08:53:08 JST

非常に親切です。これの何が親切かというと、今月が何日まであるか?とかうるう年か?などを考慮しなくてもよいこと です。
シェルスクリプトを書くときにこれはとても助かります。

 
また、ここまでは過去の日付を表示していましたが、未来の日付も可能です。

コマンド

date -d "1 day"

 
結果

2018年  4月 21日 土曜日 11:02:58 JST

このように、ago を付けなければ未来の日付になります。
 

2-3. 相対時刻の指定方法その2(last, next)

先程の例と似てはいるんですが、数値で(1ヶ月や2週間など)指定しなくても、nextlastを指定すれば相対時刻は使えます。

 
コマンド

date -d "next week"

結果

2018年  4月 27日 金曜日 08:46:20 JST

 
また、この指定であれば曜日も使えます。

date -d "next sunday"

結果

2018年  4月 22日 日曜日 00:00:00 JST

 
なお、先週の日曜日であれば

date -d "last sunday"

 
結果

2018年  4月 15日 日曜日 00:00:00 JST

とっても親切です。

また、あまり使わないかもしれませんが

date -d "tomorrow"
2018年  4月 21日 土曜日 08:46:20 JST

といった指定方法も可能です。(1日前であればyesterdayも可能)

 

使い方その3. unixtimeを活用する

その3は少し毛色が変わりますが、unixtimeというものをdateで扱う時のノウハウを説明します。

(前提)unixtimeとは

unix(linuxの大元のOSみたいなやつ)で使われる時刻の概念です。○年×月△日みたいな人間がわかる表記ではなく、ただの数値で表されます。ちなみに、1970年1月1日 0時0分 GMT を起点に計算されます。

具体例で言うと

unixtime 日付・時刻
0 1970/1/1 0:00:00
1 1970/1/1 0:00:01
60 1970/1/1 0:01:00
3600 1970/1/1 1:00:00
86400 1970/1/2 0:00:00
946684800 2000/1/1 0:00:00
1524182400 2018/4/20 0:00:00

こんな感じです。0 = 1970/1/1 0:00:00 GMTを起点にし、1秒毎に1が追加されていきます。

これを使うと何が便利かと言うと、先程と近いのですが 日付の計算を数値で行えるようになる ということが言えます。
つまり、本来は3600秒=60分=1時間のような計算や、2月は28日まで、3月は31日まで、、のように単純な規則性がない場合の考慮が不要になることがメリットです。

 

3-1. 時刻のunixtimeでの表示

まず、基本の使い方から。時刻をunixtimeで表示する場合はフォーマット指定で+%sと指定すればOKです。

コマンド

date "+%s"

結果

1524182400
# 2018-04-20 9:00  

このようになります。

 

3-2. unixtimeを普通の時刻表示に変換

次は、unixtimeから時刻に変換する場合の方法です。
こちらは、-d @"変換したいunixtime" というオプション指定でOKです。

コマンド

date -d @1524182400

結果

2018年  4月 20日 金曜日 09:00:00 JST

とこのようになります。

 

まとめ

ということで、linuxで一番親切なコマンドであるdateコマンドの魅力を お伝えしました。


スポンサーリンク




コメント一覧


コメントを投稿する


お名前


コメント内容





TOP back