日付出力形式を次のようにしたい...
01/01/2020
02/01/2020
03/01/2020
04/01/2020
05/01/2020
06/01/2020
07/01/2020
08/01/2020
09/01/2020
10/01/2020
11/01/2020
12/01/2020
13/01/2020
14/01/2020
15/01/2020
16/01/2020
17/01/2020
18/01/2020
19/01/2020
20/01/2020
21/01/2020
22/01/2020
23/01/2020
24/01/2020
25/01/2020
26/01/2020
27/01/2020
28/01/2020
29/01/2020
30/01/2020
現在私が使用しています...
cal 01 2020 | grep -v "[A-Z][a-z]"| tr ' ' '\n' | sort -n | awk '$1~/[0-9]/ { printf "%02s/%02s/%4s\n",$1,"01","2020"}'
01/01/2017
上記の形式が必要です31/12/2019
。私は何をすべきですか?
答え1
#!/bin/bash
timestamp=$( date -d '2017-01-01 12:00' +%s )
while [ "$thedate" != '31/12/2019' ]; do
printf -v thedate '%(%d/%m/%Y)T' "$timestamp"
timestamp=$(( timestamp + 86400 ))
printf '%s\n' "$thedate"
done
上記のスクリプトは、まずGNUを使用してdate
開始日の正午(1483268400
)のUNIXタイムスタンプを取得します。その後、終了日を見つけて出力するまで繰り返します。繰り返しごとにtimestamp
86400秒(24時間)を追加します。
printf
bash
日付文字列は、その形式を使用してUNIXタイムスタンプで日付と時刻の文字列をフォーマットすることができる組み込みユーティリティを使用して生成されます(この場合はバージョン4.3以降が%(...)T
必要です)。また、を使用して変数bash
に直接印刷します。 thedate
-v
GNUを持たない一部のシステムでは、コマンドライン引数の代替形式を使用する基本ユーティリティを使用して、開始日のタイムスタンプを取得date
できます。date
たとえば、OpenBSDでは次のようになります。
date -j +%s 201701011200
man date
特定のUnixを確認してください。
awk
いくつかの拡張も利用可能です。
awk 'BEGIN { print mktime("2017 01 01 12 00 00") }'
awk
ただし、これが(GNUawk
程度)ある場合は、mawk
次のすべてを実行することをお勧めしますawk
。
awk '
BEGIN {
timestamp = mktime("2017 01 01 12 00 00")
while (thedate != "31/12/2019") {
thedate = strftime("%d/%m/%Y", timestamp)
timestamp += 86400
print thedate
}
}'
答え2
現在の年と来月の最初の繰り返しを含む入れ子になったforループを追加する必要があります。各月に対してすでに行った操作を実行して、awkの最後に月と年を印刷します。