주어진 날짜 형식 쉘 스크립트의 월 및 시간 추출

주어진 날짜 형식 쉘 스크립트의 월 및 시간 추출

도움을 구하는 스크립트를 작성 중입니다. 내 스크립트에서는 다음과 같은 날짜 형식을 사용하고 있습니다(YYYY MM DD HH MM).

$ echo $DT
202002252216

이제 내 요구 사항은 파일에 나열된 두 날짜를 비교하고 출력을 시간 단위로 계산하는 것입니다.

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명령 모두에 대해 두 번) "명령의 출력이 명령 이름을 대체하도록 허용"(cf man bash)

  • "매개변수 확장/하위 문자열 확장"은 변수에서 하위 문자열을 추출합니다.

결국, 2개의 "에포크 초"를 생성하고 이를 뺀 다음 결과를 60으로 나누어 분을 얻습니다. bash정수 연산만 수행됩니다(표시되지 않음 ) ksh.

관련 정보