スポンサーリンク
突然ですが、Linuxで一番親切なコマンドは何だと思いますか?私は断然 dateコマンド だと思います。
dateコマンドは様々な「かゆいところに手が届く」オプションが用意された、とても素敵なコマンドなのです。
今回は、そんなdateコマンドの魅力を余すこと無く伝えていきたいと思います。
dateコマンドは時刻を表示するコマンドです。
日本語環境(LANG=ja_JP.UTF-8 など)であれば、以下のような出力結果になると思います。
$ date
2018年 4月 21日 土曜日 11:02:58 JST
はい。見事に現在時刻を表示してくれました。非常に無駄がないですね。
ということで、次から色々なオプションを見ていきましょう。
上記の通り、デフォルトでは出力結果が日本語表記になってしまいます。これはこれで嬉しいときもありますが、ツールの連携等を考えると全角文字やスペースは不要だったりもします。
ということで、まずはスペースなしの表記です。
コマンド
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 |
先程の例はシンプルですが、少し読みづらいかもしれません。ということで、次は半角文字で区切りを入れます。
date "+%Y/%m/%d %H:%M:%S"
2018/04/21 11:02:58
どうでしょうか。少し見やすくなりました。
これでも見やすくなったと思いますが、人間の読みやすさで言うと最初の表示(オプションなし)の方が読みやすいかと思います。
しかしオプション無しの場合、言語設定により表示が異なってしまうため、シェルスクリプト等で使う場合には工夫が必要です。
英語で表示する場合は
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桁の場合と2桁の場合がありますが、この表示形式も変更できます。
デフォルトでは1桁の場合04
のように0で埋めて(パディングして)2桁に合わせて表示してくれますが、以下のようにすればそれをやめられます。
コマンド
date "+%Y/%-m/%d"
結果
2018/4/21
上記の通り、%-m
のように%と表示内容の間に-
を入れれば0埋めをやめてくれます。
先の例では0埋めをやめる方法を書きましたが、この場合だと文字の位置がずれる場合があります。(例えば5文字目が月表示の場合と5,6文字目が月表示の場合など)
基本的にあまり問題はないですが、シェルスクリプトにするときに問題になる場合があります。
でもdateコマンドは親切なのでちゃんとそういう場合にも対応できます。_
(アンダーバー)を付けることで0の代わりにスペースで間を埋めてくれます。
コマンド
date "+%Y/%_m/%d"
結果
2018/ 4/21
このように表示形式を指定することができます。
これまで書いてきた例は基本的に現在時刻を表示していました。
しかしスクリプト等で使う場合には現在時刻以外の時刻を指定したい場合があります。そんな時、dateコマンドはその親切さを十分に発揮してきます。
例えば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オプションで指定する時刻の形式はある程度ゆらぎを許容してくれます(区切り文字を-
にしたり/
にしても大丈夫)。
親切ですね~
先程の例では○年×月△日
のように絶対時刻で指定しました。しかし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 を付けなければ未来の日付になります。
先程の例と似てはいるんですが、数値で(1ヶ月や2週間など)指定しなくても、next
やlast
を指定すれば相対時刻は使えます。
コマンド
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というものをdateで扱う時のノウハウを説明します。
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日まで、、
のように単純な規則性がない場合の考慮が不要になることがメリットです。
まず、基本の使い方から。時刻をunixtimeで表示する場合はフォーマット指定で+%s
と指定すればOKです。
コマンド
date "+%s"
結果
1524182400
# 2018-04-20 9:00
このようになります。
次は、unixtimeから時刻に変換する場合の方法です。
こちらは、-d @"変換したいunixtime"
というオプション指定でOKです。
コマンド
date -d @1524182400
結果
2018年 4月 20日 金曜日 09:00:00 JST
とこのようになります。
ということで、linuxで一番親切なコマンドであるdateコマンドの魅力を お伝えしました。
スポンサーリンク
2020/12/22 06:53:04
isotretinoin 10mg mail order on line usacybes tadalafil generic vs cialis glicky tadalafil generic online