linux : date 명령/응용

단순히 오늘 날짜 출력을 넘어서, 며칠 전/후 라든가, 연/월/일 등을 추출하고 싶다면?
잘 정리된 문서도 쉽게 찾을 순 있었지만..

그냥, 오늘 날짜를 출력하기 위해선 date 면 충분하다.

$ date
2020. 10. 19. (월) 15:16:42 KST

표현을 좀 달리하여 출력하려면, 이런 식으로 멋을 부려본다.

$ date +%F-%T
2020-10-19-15:29:00

그럼 어제 날짜는? 가감은 이런 식으로 하면 된다.

≥ date -d "-1 day"
2020. 10. 18. (일) 15:29:08 KST

≥ date -d "+10 days"
2020. 10. 29. (목) 15:29:25 KST

어제(또는 특정일) 특정 시간을 할당하려면? 예를 들어 어제 오후 4시 32분은?

$ date -d "-1 day 16:32"
2020. 10. 29. (목) 16:32:00 KST

단수일 땐 day, 복수일 땐 days! 이렇게 써야만 영문법에는 맞겠지만.. 단/복수 상관없이 그냥 day/days 어느 걸 써도 오류가 발생하진 않는다.

** ‘일’을 쓰려면 day, 연/월/일, 시/분/초 모두 영문을 쓰면 된다. year, minute 등등.

여기까지는 ‘오늘’ 날짜 기준. 즉, ‘오늘’을 출력하거나, ‘오늘’보다 며칠 전/후를 계산할 때는 위와같이 하면 되는데, 기준이 오늘이 아니라면?

사실 -d, 즉 –date 는 기준 날짜를 줄 때 사용하는 선택 사항이다.

$ date --date "20-3-31"
2020. 03. 31. (화) 00:00:00 KST

우리나라 식으로 ‘연-월-일’ 이렇게 줘도 되고, 외국(미국?) 식으로 ‘월/일/연’ 이렇게 해도 된다.

그럼, 날짜에서 연, 월, 일을 따로 출력하려면?
즉, 오늘 날짜의 ‘월’은?

+%Y, +%m, +%d 형식을 쓴다. 대소문자 구분을 해야 한다. (자세한 사항은 FORMAT controls the output. 항목 참고)

≥ date "+%Y"
2020

≥ date "+%m"
10

≥ date "+%d"
19

≥ date "+%Y-%m-%d"
2020-10-19

이제 마지막. 위에 설명한 두가지를 한꺼번에 써본다.

‘특정일’을 지정한 뒤, 연/월/일을 출력하려면?

date --date "5/1/20" "+%Y"
2020

‘특정일’에서 날짜를 계산하려면?

date --date "20-4-30 +51 day"
2020. 06. 20. (토) 00:00:00 KST

따옴표 안에 날짜와 계산식이 모두 들어가 있어야 한다.


이제 최종 심화 학습.

특정 날짜에서 45일을 더하고, 그 날짜의 “연-월-일”을 출력하고 싶다. 사실 이걸 하기 위해서 먼 길을 달려왔다.

“특정 날짜”는 프로그램(Shell Script)에서 임의로 지정된다는 가정하에 진행한다.
오류를 확실히 하기 위해, 먼저 틀린 방법을 넣어본다. (이렇게 할 필요가 전혀 없었는데.. 오랜만에 Shell script 를 하다보니 감이 많이 떨어져있었다.)

TODAY_DATE=$(date)
YESTERDAY_DATE=$(date --date "$TODAY_DATE -1 day")

이러면 오류가 발생한다. 첫번째가 아니라 두번째에서.
--date 는 ‘날짜’ 형식으로 인수를 받는데, $TODAY_DATE 는 날짜 뿐만 아니라 시간과 시간대까지 포함하고 있으므로 제대로 처리되지 않는다. 시간까지는 –date 에서 인식을 하지만, 날짜 문자열 형식이 다르고, KST 등이 들어가 있어서 제대로 인식되지 않는 듯 하다.

이렇게 넣으면 문제는 없다.

$ date --date "2020-9-19 14:16:05"
2020. 09. 19. (토) 14:16:05 KST

아무튼, 날짜를 Shell 에서 연산 하려면, ‘날짜’만을 출력하도록 바꿔줘야 한다. 또는 시간이 필요하다면 “연-월-일 시:분:초” 형식을 사용해야 한다.

$ TODAY_DATE=$(date "+%D") # 또는 +%F 도 된다. %F = YYYY-MM-DD
$ YESTERDAY_DATE=$(date --date "$TODAY_DATE -1 day" "+%D")
$ echo $YESTERDAY_DATE
10/18/20

허나.. $YESTERDAY_DATE 는, 굳이 저렇게 할 필요는 없고 그냥 -1 day 만 넣어주면 된다. 즉, 어제를 구하기 위해선,

YESTERDAY_DATE=$(date --date "-1 day" "+%D")

이거면 충분하다.

** 충분하다고 생각했으나.. (21.05.12 추가)


경과 시간을 기록할 일이 생겨버렸다. 시작시간과 종료시간만 있으면 간단하지만.. 이걸 구현하려면 일반 문자열이 아닌 Epoch 형식으로 결과를 얻어내야 한다.

START_TIME=$(date +%s)
END_TIME=$(date +%s)

+%s 만 붙여주면 된다. 이 결과는 이렇다.

$ date +%s
1620826522

$ date
2021. 05. 12. (수) 22:35:51 KST

이 값으로 계산을 해주면 끝인데..

$ TIME_DURATION=$(( $END_TIME - $START_TIME ))
$ echo $TIME_DURATION
98

98 이면 1분 38초인데.. 그냥 이 정도는 계산이 되지만, 백단위만 넘어가도 보기가 편하질 않다.
이에, 이런 명령을 사용한다.

date -u -d @${TIME_DURATION} +%T

자세한 설명은 sampson-chen 에게 넘기기로 하고, 출력은 이렇다.

$ date -u -d @${TIME_DURATION} +%T
00:01:38

훨씬 눈에 편하지? 이것도 Eye candy 라 해도 되려나?

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.