HPUXで毎月2日目(8月2日など)を取得する方法。
date -d
HPUX Unixでは動作しません。
答え1
GNUとbusyboxを使用して実装されました。
$ date -d '2020-08-02' "+%A"
Sunday
FreeBSDの場合:
$ date -j -f "%d %m %Y" "02 08 2020" "+%A"
Sunday
年のすべての月の2日目を得るには、次のdays-in-a-year.shスクリプトを使用できます。
#!/usr/bin/env sh
year=2021
month=1
while [ $month -le 12 ]; do
# GNU and busybox
date -d "$year-$month-02" "+%d %B %Y: %A"
# FreeBSD
# date -j -f "%d %m %Y" "02 $month $year" "+%d %B %Y: %A"
month=$(( month + 1 ))
done
出力:
$ ./days-in-a-year.sh
02 January 2021: Saturday
02 February 2021: Tuesday
02 March 2021: Tuesday
02 April 2021: Friday
02 May 2021: Sunday
02 June 2021: Wednesday
02 July 2021: Friday
02 August 2021: Monday
02 September 2021: Thursday
02 October 2021: Saturday
02 November 2021: Tuesday
02 December 2021: Thursday
ちなみに、cal
FreeBSDとLinuxで利用可能で、コマンドラインでカレンダーを表示できるutil-linuxパッケージの一部と呼ばれる素晴らしいユーティリティがあります。
$ cal
August 2021
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
答え2
HPUXで動作する必要があると思うPOSIXソリューションを使用すると、次のように起動できます。cal
year=2021 month=8 # Omit entirely for current year and month
cal $month $year |
sed -nE 's/ 2( .*|)$//p' |
awk '{ split("Sun Mon Tue Wed Thu Fri Sat",h); print h[length($0)/3+1]}'
出力
Mon
説明する
このcal
コマンドはカレンダーを印刷します。
cal
August 2021
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
{space} 2 {space}
行の終わりにパターンまたはaを見つけ、その後のすべての項目を削除します。{space} 2
次に、結果の行の長さを3(週ごとに3列)に分割し、曜日配列の1
インデックスに追加します。
sed
(としてマージすることもできましたが、追加の複雑さawk
のために努力する価値がないと判断しました。)
ここで望むように、年の数ヶ月間繰り返すのは簡単です。
year=2021
for month in January February March April ...
do
day=$(
cal "$month" "$year" |
sed -nE 's/ 2( .*|)$//p' |
awk '{
split("Sunday Monday Tuesday Wednesday Thursday Friday Saturday", h);
print h[length($0)/3+1]
}'
)
printf "%02d %s %d: %s\n" 2 "$month" "$year" "$day"
done
答え3
cu=`date +%d`
date --date="$(date --date='1 month ago') -$cu days +2days" +%A" "%Y-%m-%d
Friday 2021-07-02
date --date="$(date --date='1 month') -$cu days +2days" +%A" "%Y-%m-%d
Thursday 2021-09-02