1. 사용 명령어 |
(1) date
(2) tar
2. 키워드 & 사용처 |
(1) 키워드
전월, 월말
(2) 사용처
오늘 날짜에서 지난달 년월표기(YYYYMM)를 조합해서 해당 날짜가 파일명에 있는 로그 파일을 아카이브하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./lastmonth.sh
/var/log/myapp/access.log-20210224
/var/log/myapp/access.log-20210225
/var/log/myapp/access.log-20210226
/var/log/myapp/access.log-20210227
/var/log/myapp/access.log-20210228
4. 스크립트 |
#!/bin/sh
logdir="/var/log/myapp"
# 이번달 15일 날짜 취득
thismonth=$(date '+%Y/%m/15 00:00:00') ①
# 지난달 날자를 YYYYMM으로 취득
# 1 month ago는 지난달의 같은 '날(일)'이 되므로 말일을 피하도록
# 변수 thismonth에 15일을 지정함
last_YYYYMM=$(date -d "$thismotn -1 month ago" '+Y%m') ②
# 지난달 로그 파일을 아카이브
tar cvf ${last_YYYYMM}.tar ${logdir}/access.log-${last_YYYYMM}* ③
5. 해설 |
이 스크립트는 오늘 날짜를 기준으로 해서 지난달 년월표기(YYYYMM)를 조합해서 로그 파일에서 지난달 분량을 아카이브합니다. 오늘이 2021년 3월 29일이라고 하고, /var/log/myapp 디렉터리에는 파일명에 날짜가 포함된 "access.log-년월일" 파일이 존재한다고 가정합니다.
/var/log/myapp/access.log-20210224
/var/log/myapp/access.log-20210225
/var/log/myapp/access.log-20210226
/var/log/myapp/access.log-20210227
/var/log/myapp/access.log-20210228
... 생략 ...
지난달 날짜 표기를 얻고 싶다면 리눅스에서는 date 명려어 -d 옵션으로 한 달 전을 뜻하는 "1 month ago"를 지정하면 편리합니다. 하지만 이 옵션을 사용할 때는 주의해야 할 사항이 있습니다.
$ date "+%Y/%m/%d %H:%M:%S"
2021/03/29 10:56:43 오늘 날짜
$ date "+%Y/%m/%d %H:%M:%S" -d "1 month ago"
2021/03/01 10:56:44 2월 28일이 아님
이 결과처럼 3월 29일에는 date -d "1 month ago"를 실행해도 2월 말인 2월 28일이 되지 않습니다. 이것은 리눅스 date 명령어로 "1 month ago"를 지정하면 "지난달의 같은 날"을 취득하기 때문입니다.
이 예제에서는 오늘이 3월 29일이므로 "2월 29일"을 취득하려고 하지만 그런 날은 존재하지 않으므로 2월 28일에서 계산하면 2일 뒤 즉, 3월 1일이 됩니다.
이런 상황이 발생하지 않도록 모든 달에 존재하는 날짜를 지정해서 "1 month ago"를 사용합니다. 즉 1~28일 중 하루를 지정합니다. 예제에서는 ①처럼 중간 쯤인 15일을 선택했습니다.
②에서 앞서 15일로 지정한 이번달 날짜에서 지난달을 얻기 위해 date 명령어로 "1 month ago" 날자를 얻습니다. '+%Y%m'을 지정해서 지난달 년월표기(YYYYMM)를 얻습니다.
③에서 지난달 날짜로 로그 파일을 아카이브합니다. 오늘이 3월 29일이면 2021년 2월 로그 파일을 아카이브 합니다.
tar cvf 202102.tar /var/log/myapp/access.log-202102*
<주의사항>
FreeBSD나 Mac에서 지난달을 취득하려면 스크립트 ②에서 -d '1 month ago' 대신에 -v 옵션을 사용합니다.
last_YYYYMM=$(date -v-1m "+%Y/%m")
-v-1m은 '-v 옵션에 -1m 지정'을 의미합니다.
FreeBSD나 Mac에서 -v-1m으로 지정한 "1개월 전"은 리눅스 "1 month ago"와는 달리 지난달 말일이 됩니다. 따라서 15일로 날짜를 바꿀 필요가 없습니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 네트워크 - 055 디폴트 게이트웨이에 ping이 통하는지 확인하기(리눅스) (0) | 2021.03.29 |
---|---|
[Linux 셸 스크립트] 날짜 처리 - 054 윤년인지 확인하기 (0) | 2021.03.29 |
[Linux 셸 스크립트] 날짜 처리 - 052 오늘이 말일인지 판별하기 (0) | 2021.03.26 |
[Linux 셸 스크립트] 날짜 처리 - 051 date 명령어로 두 날짜를 비교하고 날짜차를 구하기 (0) | 2021.03.26 |
[Linux 셸 스크립트] 파일처리 - 050 sed로 파일 치환 심볼릭 링크를 실제 파일로 바꾸지 않게 하기 (0) | 2021.03.26 |
댓글