프로그래밍

[유닉스초보] 쉘 스크립트 날짜 계산, 유닉스 쉘에서 이틀 전, 삼일 전 날짜 구하기 (서버관리 기초)

할랑할랑 2014. 6. 3. 16:42
반응형

[유닉스초보] 쉘 스크립트 날짜 계산, 유닉스 쉘에서 이틀 전, 삼일 전 날짜 구하기 (서버관리 기초) (Unix, Linux)

- 어제 날짜
echo `TZ=KST+15; date +%Y%m%d`

- 2일 전(서버 / OS별로 적용 안되는 경우 많음)
echo `TZ=KST+39; date +%Y%m%d`

- 2일 전 펄 스크립트(추천. TZ(표준시간대) 계산법이 통하지 않거나, 24시간으로 제한이 걸린 경우)
echo `perl -e '@T=localtime(time-(86400*2));printf("%04d%02d%02d",$T[5]+1900,$T[4]+1,$T[3])'`

- 리눅스
echo `date -d '2 days ago' +%Y%m%d`

- 쉘 스크립트 활용: 구글에서 검색어 "WORK_DATE=$YEAR$MON$DAY" 로 검색(쌍따옴표 포함하여 검색)

 

쉘 스크립트에서 어제 날짜를 계산할 때, 간단하게 이용하는 방법으로 많이들 표준시간대(KST)를 활용한 방법을 사용하한다(그렇지만... 확인해보니, 모든 운영체제 환경에서 동일하게 잘 적용되진 않는다.)

#어제 날짜 출력
YESTERDAY=`TZ=KST+15; date +%Y%m%d`
echo $YESTERDAY

한국시각이 표준시간대 KST-9 이므로, 표준시간대에서 하루(24)를 더한 후 -9를 해주면 어제 날짜로 보이는 원리이다.(대한민국, 우리나라)
(표준시간대 현재 값은 echo $TZ 혹은 export | grep TZ 또는 env | grep TZ 등 여러가지 방법으로 확인 가능. 단, 일부 리눅스에는 /etc/localtime 파일이 /usr/share/zoneinfo/ 의 어떤 파일과 일치하는 지 확인하여야한다. 해당 파일이 timezone data 바이너리 파일이긴 하지만, cat /etc/localtime 해봐도 추론은 가능하다.)

마찬가지 방법으로 이틀 전, 삼일 전, 혹은 내일, 모레 날짜도 계산이 가능할 것 같지만...

#아래 방법은 적용 안되는 경우도 있는 것으로 확인(timezone 변경에 최대값 최소값 제한 존재 확인)
#이틀 전(24*2-9)
echo `TZ=KST+39; date +%Y%m%d`
#삼일 전(24*3-9)
echo `TZ=KST+63; date +%Y%m%d`

실험결과 AIX 운영체제 서버(IBM)에는 동작하는 것으로 보이나, 일부 HP-UX OS를 사용하는 HP서버에서는 표준시간대 계산 방법이 24시간까지로 제한이 걸려있는 것으로 보인다. HP-UX에서는 아래 두 구문은 가능하였으나, 25시간으로 늘렸을 때 부터는 TZ(TimeZone, 타임존)이 의도대로 적용되지 않았다.

리눅스에서는 훨씬 간단한 방법으로, date 명령 자체가 이틀 전, 삼일 전 등 현재 시각이 아닌 다른 시간대를 보여주는 방법이 있으므로 활용하면 된다.

#리눅스인 경우...
TWO_DAYS_AGO=`date -d '2 days ago' +%Y%m%d`
echo $TWO_DAYS_AGO

대부분의 유닉스/리눅스에서는 펄 스크립트(Perl Scipts)가 지원되므로, 펄을 활용하여 표준 시간대를 구하는 방법도 있다.(HP-UX 등) 차라리 perl을 활용하면 운영체제 등에 구애받지 않고 표준 시간대 계산이 가능하다.

#펄 활용(추천)
#어제 날짜 출력(하루 전)
echo `perl -e '@T=localtime(time-86400);printf("%04d%02d%02d",$T[5]+1900,$T[4]+1,$T[3])'`
#이틀 전
echo `perl -e '@T=localtime(time-86400*2);printf("%04d%02d%02d",$T[5]+1900,$T[4]+1,$T[3])'`
#삼일 전(3일 전 계산)
echo `perl -e '@T=localtime(time-86400*3);printf("%04d%02d%02d",$T[5]+1900,$T[4]+1,$T[3])'`

#삼일 전 예시...
THREE_DAYS_AGO=`perl -e '@T=localtime(time-86400*3);printf("%04d%02d%02d",$T[5]+1900,$T[4]+1,$T[3])'`
echo $THREE_DAYS_AGO

인터넷에 찾아보면 아예, 쉘 스크립트의 달력 명령(cal) 등을 활용해 특정 날짜를 계산해주는 쉘 스크립트도 돌아다니므로 검색해보면 나온다.
- 구글 검색어 "WORK_DATE=$YEAR$MON$DAY" 로 검색. 반드시 쌍따옴표를 넣어서 검색해야 결과가 잘 나온다.
(검색 결과 링크: https://www.google.co.kr/search?num=100&newwindow=1&q=%22WORK_DATE%3D%24YEAR%24MON%24DAY%22&oq=%22WORK_DATE%3D%24YEAR%24MON%24DAY%22&gs_l=serp.3..30i10.7944.9133.0.9581.3.3.0.0.0.0.143.389.0j3.3.0....0...1c.1.45.serp..0.3.386.6VzQIVgeCm8)

개인적으로는 펄 스크립트를 활용한 방법을 추천한다.


※ 관련글
- [유닉스, 리눅스 서버 관리 초보] tar로 파일 묶기, 풀기 및 간단한 파일 압축(compress, uncompress)http://hallang.tistory.com/394 )
- [리눅스 초보 서버관리] 시간동기화 ntp 타임서버 클라이언트 설정http://hallang.tistory.com/368 )
- [초보] vi 에디터에서 줄번호(행번호, 라인넘버) 표시 하기 ( http://hallang.tistory.com/285 )

반응형