Linux コマンド[date +%Y%m%d%H%M%S -d 2015 日付]の出力結果で末6桁に0が追加される…

投稿者: Anonymous

Windows PCからテラタームでLinuxサーバに接続し、下記のコマンドを実行します。(シバンではsh指定)

date +%Y%m%d%H%M%S -d 20151121181111

シェル実行後に期待したい出力結果は、20151121181111と出ることです。
しかし出力されるのは 20151121181111000000 となります。
最終的には、CSVファイルに記載されている日付項目を取り出し、正しい日付形式になっているかどうかを判定するシェルスクリプトを作成したいと思っています。0が出てしまい、正しい比較ができず困っています。(もっとも、別のやり方があるかもしれませんが…)

dateコマンドの仕様等リサーチを行いましたが、どうしてもこの0の出力をコントロールする方法が分かりません。
お力添え頂けませんでしょうか。

解決

時刻表記のフォーマットを変えて試してみました。

$ date +'%Y-%m-%d %H:%M:%S' -d '20151121181111'
2015112118-11-11 00:00:00

つまり、年月日と時分秒の区切りが必要なのですね。そこで、スペースを入れてみました。

$ date +'%Y%m%d%H%M%S' -d '20151121 181111'
date: `20151121 181111' は無効な日付です

さらに時分秒については : で区切る必要がある様です。

$ date +'%Y%m%d%H%M%S' -d '20151121 18:11:11'
20151121181111

追記

RedHat 系 Linux の /bin/sh/bin/bash へのシンボリックリンクになっている場合が多いかと思いますので、bash の substring expansion を使って以下の様にすると良いかもしれません。

$ d='20151121181111'
$ date +'%Y%m%d%H%M%S' -d "${d::8} ${d:8:2}:${d:10:2}:${d:12:2}"
20151121181111

bash ではない場合は(例えば Debian 系 Linux では /bin/dash)、以下の様になります。

$ d='20151121181111'
$ date +'%Y%m%d%H%M%S' -d "$(expr substr $d 1 8) $(expr substr $d 9 2):$(expr substr $d 11 2):$(expr substr $d 13 2)"
20151121181111

また、Linux では distribution に依らずに sed は GNU sed でしょうから、以下の様にもできます。

$ date +'%Y%m%d%H%M%S' -d "$(echo $d | sed -r 's/(.{8})(.{2})(.{2})(.{2})/1 2:3:4/')"
回答者: user9156

Leave a Reply

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