(O+P)ut

OutPut Log by SE in SIer



(O+P)ut

Output Log by SE

dateコマンドで一連の日付を出力する

スポンサーリンク

はじめに

Excelではセルに日付データを入力して1日足す演算を行い、ドラッグ&ドロップを行えばカレンダーに沿って日付が表示されます。そして表示形式を変更すれば自由な形式で取り出せます。

今回は同じような処理として、UNIX系OSにて一連の日付を「yyyymmdd」形式で出力するワンライナーを記載しました。

コマンド実行状況
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ date --version
date (GNU coreutils) 8.26

seqとsedとdateと私

2018年12月30日から5日間の日付をyyyymmdd形式で出力しました。

$ seq 0 4 | sed 's/^/20181230 /' | sed 's/$/ days/' | date -f - '+%Y%m%d'
20181230
20181231
20190101
20190102
20190103


以下、補足です。

補足

dateコマンドの-d "XXXXXXXX 1 days"の記法によって指定日から任意の日付だけずらして表示するオプションを利用します。

例えば以下のようになります。

$ date -d "20181230 1 days" '+%Y%m%d'
20181231

この引数部分をパイプで渡すために以下のオプションを使います。

-f, --file=DATEFILE
like --date; once for each line of DATEFILE

渡し方は標準入力からなので、コマンドとしては-f - とします。以下がその例ですがechoの結果が引数になっています。

$ echo "20181230 1 days" | date -f - '+%Y%m%d'
20181231

上のワンライナーを知っていればあとは「起点の日付 X days」部分のXに「1,2,3,...」という数字を入れるべくsedコマンドを利用します。

$ seq 0 4 | sed 's/^/20181230 /'
20181230 0
20181230 1
20181230 2
20181230 3
20181230 4

「^」は先頭行を指すので頭に起点の日付をスペース付きで差し込んでいます。

$ seq 0 4 sed 's/^/20181230 /' | sed 's/$/ days/'
20181230 0 days
20181230 1 days
20181230 2 days
20181230 3 days
20181230 4 days

同じように行末を意味する「$」の後ろに「days」をスペース付きで差し込んでいます。

そして、再掲ですが以下が表題を実践するワンライナーです。

$ seq 0 5 | sed 's/^/20181230 /' | sed 's/$/ days/' | date -f - '+%Y%m%d'
20181230
20181231
20190101
20190102
20190103
20190104

この書き方は結構応用がきき、例えば2019年の各月の日数もワンライナーで出せます。

$ seq 0 364 | sed 's/^/20190101 /' | sed 's/$/ days/' | date -f - '+%Y%m' | uniq -c
     31 201901
     28 201902
     31 201903
     30 201904
     31 201905
     30 201906
     31 201907
     31 201908
     30 201909
     31 201910
     30 201911
     31 201912

終わりに

個人的には結構便利に使っているワンライナーですが、同様のことをサクッと行いたい方の参考になれば幸いです


他の記事を読む