정보

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

    • 작성자    : 이상호

    • 작성일    : 2021-01-06

    • 설   명    :

    • 수정이력 :

     

     내용

    [개요]

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

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

     

     

    [특징]

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

     

    [기능]

    • 날짜 기간에 파일 조회

    • 일별 통계 생산

     

    [활용 자료]

    • 없음

     

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

    • 없음

     

    [사용법]

    • 소스 코드 참조

     

    [사용 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 (에러 로그)

     

     

    [명세]

    • [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

     

    • Execution.log

     

    • Error.log

     

    [전체]

    • 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
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기