与えられた日付形式シェルスクリプトの月と時間の抽出

与えられた日付形式シェルスクリプトの月と時間の抽出

助けを求めるスクリプトを書いています。私のスクリプトでは、次の日付形式を使用しています(YYYY MM DD HH MM)。

$ echo $DT
202002252216

私の要件は、ファイルにリストされている2つの日付を比較し、出力を時間単位で計算することです。

cat /home/postgres/pglinux_mm_cfg
MM_START=202002261015
MM_END=202002261530
MM_SERVER=pglinux 

これは私のスクリプトです。timediff.sh

ENV=/home/postgres
MM_START=`grep MM_START ${ENV}/\`hostname\`_mm_cfg |awk -F"=" '{print $2}'`
MM_END=`grep MM_END ${ENV}/\`hostname\`_mm_cfg |awk -F"=" '{print $2}'`

MPHR=60
STARTIME=$(date +%Y%m%d%H%M -d ${MM_START})
ENDTIME=$(date +%Y%m%d%H%M  -d ${MM_END})
MINUTES=$(( ($ENDTIME - $STARTIME) / $MPHR ))

echo $STARTIME $ENDTIME $MINUTES

MM_ENDとMM_STARTの日付と時刻の違いを取得するには?

を使用していますksh

答え1

これは望むものではないかもしれませんが、適切なプログラミング言語を使用する方がはるかに簡単です。 PHPを例に挙げましょう。

<?php
$o1 = date_create('202002261015');
$o2 = date_create('202002261530');
$o3 = date_diff($o2, $o1);
echo 'days: ', $o3->d, ', hours: ', $o3->h, "\n";

結果:

days: 0, hours: 5

https://php.net/function.date-diff

答え2

動作する必要があります(ただしテストされていません)ksh

echo "$MM_START", "$MM_END", $(( ($(date -d"${MM_END:0:8} ${MM_END:8}" +%s) - $(date -d"${MM_START:0:8} ${MM_START:8}" +%s) )/ 60 ))
202002261015, 202002261530, 315

これはシェルの

  • $((...))差分と除算を行う「算術拡張」

  • 「コマンドの置き換え」$(...)(両方のdateコマンドに対して2回)「コマンドの出力がコマンド名を置き換えることを許可する」(cf man bash

  • 「パラメータ拡張/サブストリング拡張」は、変数からサブストリングを抽出します。

結局、2つの「エポック秒」を生成し、それを引いた後、結果を60で割って分を取得します。bash整数演算のみが実行されます(表示されません)ksh

関連情報