[ShellScript] 쉘 스크립트 날짜 기간에 대한 파일 조회 및 일별 통계 생산

 정보

  • 업무명    : 쉘 스크립트 날짜 기간에 대한 파일 조회 및 일별 통계 생산

  • 작성자    : 이상호

  • 작성일    : 2021-01-06

  • 설   명    :

  • 수정이력 :

 

 내용

[개요]

  • 안녕하세요? 기상 연구 및 웹 개발을 담당하고 있는 해솔입니다.

  • 오늘 포스팅에서는 날짜 기간에 대한 파일 조회 및 일별 통계 생산을 소개합니다.

 

etc-image-0

 

[특징]

  • 리눅스에서 일별 통계 생산을 하기 위해서 쉘 스크립트 기술이 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어

 

[기능]

  • 날짜 기간에 파일 조회

  • 일별 통계 생산

 

[활용 자료]

  • 없음

 

[자료 처리 방안 및 활용 분석 기법]

  • 없음

 

[사용법]

  • 소스 코드 참조

 

[사용 OS]

  • Linux (CentOS v7.3)

  • VMware Workstation Pro v15.5

 

[사용 언어]

  • ShellScript (csh)

 

 소스 코드

  • 소스 코드는 단계별로 수행하며 상세 설명은 다음과 같습니다.

  • 작업 환경의 경우 수행 쉘, 파일 조회 경로, 일별 통계, 로그 파일로 구성되어 있습니다.

  디렉터리명 파일명
작업 경로 prjDir=/SYSTEM/TEST/DataCountCheck  
수행 쉘 ${prjDir} RunShell-DataCountCheck.csh
파일 조회 경로 /DATA/IMG/DAILY *%Y%m%d%H%M*_*-*_*.mp4
일별 통계 ${prjDir} Stat_Result.log
로그 파일 ${prjDir} Execution.log (실행 로그)
Error.log (에러 로그)

 

etc-image-1

 

[명세]

  • [1 단계] 수행 쉘 실행 및 시작/종료 시간에 대한 반복문 수행

    • csh RunShell-DataCountCheck.csh 명령어를 통해 쉘 실행

    • 시작 날짜 (srtDateTime) 및 종료 날짜 (endDateTime)를 이용해서 유닉스 시간 (dtSrtUnix, dtIncUnix, dtEndUnix)으로 변환

    • 1일 간격으로 시작/종료에 대한 반복문 수행

#!/bin/csh

set srtDateTime = "2020-07-01 00:00"
set endDateTime = "2020-10-01 00:00"

set dtSrtUnix = `date -d "${srtDateTime}" +%s`
set dtEndUnix   = `date -d "${endDateTime}" +%s`
set dtIncUnix = $dtSrtUnix

while ($dtIncUnix < $dtEndUnix)

...

end

 

  • [2 단계] 날짜 재 변환 및 파일 조회

    • date 명령어를 통해 유닉스 시간을 년 (sYear), 월 (sMonth), 일 (sDay), 년월일 (dtYmd)로 재 변환

    • find 명령어를 통해 날짜에 대한 파일 조회 목록 (fileList) 저장

   set sYear = `date +"%Y" -d @$dtIncUnix`
   set sMonth = `date +"%m" -d @$dtIncUnix`
   set sDay = `date +"%d" -d @$dtIncUnix`
   set dtYmd = `date +"%Y%m%d" -d @$dtIncUnix`

   set iCount = 0
   @ dtIncUnix = `date -d "${sYear}${sMonth}${sDay} 1 days" +%s`

   set fileList = `find  /DATA/IMG/DAILY -name "*${dtYmd}*_*-*_*.mp4"`

 

  • [3 단계] 조회 목록에 따른 분기 처리

    • 파일 조회 목록이 없을 경우 일별 통계, 실행/에러 로그 기록 후 반복문 건너뛰기

    • 반면에 있을 경우 foreach 명령어를 통해 파일 정보를 실행 로그 (Execution.log)에 기록 그리고 일별 통계 (Stat_Result.log) 기록

   if (${#fileList} < 1) then
      echo [`date "+%Y/%m/%d %T"`] $sYear $sMonth $sDay $iCount >> Stat_Result.log
      echo [`date "+%Y/%m/%d %T"`] $dtYmd "F"  >> Execution.log
      echo [`date "+%Y/%m/%d %T"`] $dtYmd "F" "find  /DATA/IMG/DAILY -name *${dtYmd}*_*-*_*.mp4"  >> Error.log

      continue
   endif

   foreach sDirFile ($fileList)
      @ iCount++
      echo [`date "+%Y/%m/%d %T"`] $dtYmd "S" $sDirFile:h $sDirFile:t >> Execution.log
   end

   echo [`date "+%Y/%m/%d %T"`] $sYear $sMonth $sDay $iCount >> Stat_Result.log

 

  • Stat_Result.log

etc-image-2

 

  • Execution.log

etc-image-3

 

  • Error.log

etc-image-4

 

[전체]

  • RunShell-DataCountCheck.csh

#!/bin/csh

set srtDateTime = "2020-07-01 00:00"
set endDateTime = "2020-10-01 00:00"

set dtSrtUnix = `date -d "${srtDateTime}" +%s`
set dtEndUnix   = `date -d "${endDateTime}" +%s`
set dtIncUnix = $dtSrtUnix

while ($dtIncUnix < $dtEndUnix)
   set sYear = `date +"%Y" -d @$dtIncUnix`
   set sMonth = `date +"%m" -d @$dtIncUnix`
   set sDay = `date +"%d" -d @$dtIncUnix`
   set dtYmd = `date +"%Y%m%d" -d @$dtIncUnix`

   set iCount = 0
   @ dtIncUnix = `date -d "${sYear}${sMonth}${sDay} 1 days" +%s`

   set fileList = `find  /DATA/IMG/DAILY -name "*${dtYmd}*_*-*_*.mp4"`

   if (${#fileList} < 1) then
      echo [`date "+%Y/%m/%d %T"`] $sYear $sMonth $sDay $iCount >> Stat_Result.log
      echo [`date "+%Y/%m/%d %T"`] $dtYmd "F"  >> Execution.log
      echo [`date "+%Y/%m/%d %T"`] $dtYmd "F" "find  /DATA/IMG/DAILY -name *${dtYmd}*_*-*_*.mp4"  >> Error.log

      continue
   endif

   foreach sDirFile ($fileList)
      @ iCount++
      echo [`date "+%Y/%m/%d %T"`] $dtYmd "S" $sDirFile:h $sDirFile:t >> Execution.log
   end

   echo [`date "+%Y/%m/%d %T"`] $sYear $sMonth $sDay $iCount >> Stat_Result.log
end

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com