경과 시간을 계산하는 Bash 스크립트
명령어 실행에 소요된 시간을 계산하기 위해 bash 스크립트를 작성하고 있습니다.다음 사항을 고려해 주십시오.
STARTTIME=$(date +%s)
#command block that takes time to complete...
#........
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."
내 논리는 맞지만, 결국 다음과 같은 인쇄물이 나오게 됩니다.
"이 작업을 완료하는 데 몇 초가 걸립니다.."
내 스트링 평가에 무슨 문제라도 있어?
bash 변수는 입력되지 않았다고 생각합니다만, 그래도 bash에 string to integer 메서드가 있으면 좋겠습니다.
내부 변수 "$SEConds"를 사용하는 것이 매우 깨끗하다고 생각합니다.
SECONDS=0 ; sleep 10 ; echo $SECONDS
중 하나$(())
★★★★★★★★★★★★★★★★★」$[]
산술 연산의 결과를 계산하는 데 사용됩니다. 있어요$()
단순히 문자열을 명령어로 평가하는 것입니다.약간 미묘한 차이입니다.
팅크가 댓글에서 지적했듯이$[]
되지 않으며, 권장되지 않습니다.$(())
우대해야 합니다.
이 을 시도하고 있습니다.ENDTIME
, 에러, 에러, 에러, 에러, 에러, 에러, 에러, 이런 것도 볼 수 있어요. 1370306857: command not found
대신 산술 확장을 사용합니다.
echo "It takes $((ENDTIME - STARTTIME)) seconds to complete this task..."
스크립트로 도 있습니다.commands.sh
명령어 을 사용합니다.
time commands.sh
Bash's Bash'를 사용할 수 .time
합니다.
TIMEFORMAT='It takes %R seconds to complete this task...'
time {
#command block that takes time to complete...
#........
}
은 " " " 가 프리픽스 되어 됩니다.
time
예약된 단어가 표시됩니다.%
'는 되는 이스케이프 이스케이프 시퀀스와 그 의미는 다음과 같습니다.괄호는 옵션의 부분을 나타냅니다.%% A literal ‘%’. %[p][l]R The elapsed time in seconds. %[p][l]U The number of CPU seconds spent in user mode. %[p][l]S The number of CPU seconds spent in system mode. %P The CPU percentage, computed as (%U + %S) / %R.
옵션 p는 소수점 뒤의 소수 자릿수인 정밀도를 지정하는 숫자입니다.값이 0이면 소수점이나 분수가 출력되지 않습니다.소수점 뒤에 최대 3자리까지 지정할 수 있으며, 3보다 큰 p 값은 3으로 변경됩니다.p를 지정하지 않으면 값 3이 사용됩니다.
인 the
l
는 MMMSS 형식의 긴 포맷(분 포함)을 지정합니다.FFs. p의 값에 따라 분수가 포함되는지 여부가 결정됩니다.이 변수가 설정되지 않은 경우 Bash는 값이 있는 것처럼 동작합니다.
$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
값이 null일 경우 타이밍 정보는 표시되지 않습니다.형식 문자열이 표시될 때 후행 줄바꿈이 추가됩니다.
숫자가 큰 경우는, 보다 읽기 쉬운 형식으로 인쇄하는 것이 좋습니다.다음 예시는 다른 예와 동일하지만 "인간" 형식으로도 인쇄됩니다.
secs_to_human() {
if [[ -z ${1} || ${1} -lt 60 ]] ;then
min=0 ; secs="${1}"
else
time_mins=$(echo "scale=2; ${1}/60" | bc)
min=$(echo ${time_mins} | cut -d'.' -f1)
secs="0.$(echo ${time_mins} | cut -d'.' -f2)"
secs=$(echo ${secs}*60|bc|awk '{print int($1+0.5)}')
fi
echo "Time Elapsed : ${min} minutes and ${secs} seconds."
}
간단한 테스트:
secs_to_human "300"
secs_to_human "305"
secs_to_human "59"
secs_to_human "60"
secs_to_human "660"
secs_to_human "3000"
출력:
Time Elapsed : 5 minutes and 0 seconds.
Time Elapsed : 5 minutes and 5 seconds.
Time Elapsed : 0 minutes and 59 seconds.
Time Elapsed : 1 minutes and 0 seconds.
Time Elapsed : 11 minutes and 0 seconds.
Time Elapsed : 50 minutes and 0 seconds.
다른 투고에서 설명한 대로 스크립트에서 사용하려면(시작점을 캡처한 후 종료 시간을 사용하여 함수를 호출합니다).
start=$(date +%s)
# << performs some task here >>
secs_to_human "$(($(date +%s) - ${start}))"
다음 코드를 사용해 보십시오.
start=$(date +'%s') && sleep 5 && echo "It took $(($(date +'%s') - $start)) seconds"
다음은 Mike Q의 기능을 대신하는 한 줄짜리 옵션입니다.
secs_to_human() {
echo "$(( ${1} / 3600 ))h $(( (${1} / 60) % 60 ))m $(( ${1} % 60 ))s"
}
경과초 옵션과 함께 시간을 사용해 보십시오.
/usr/bin/time -f%e sleep 1
배쉬 중
또는\time -f%e sleep 1
interactive bash에서.
타임맨 페이지 참조:
bash 쉘 사용자는 셸 빌트인 배리언트가 아닌 external time 명령을 실행하려면 명시 경로를 사용해야 합니다./usr/bin에 시간이 설치되어 있는 시스템에서는 첫 번째 예는 /usr/bin/time wc/etc/hosts가 됩니다.
그리고.
FORMATTING THE OUTPUT
...
% A literal '%'.
e Elapsed real (wall clock) time used by the process, in
seconds.
Lon Kaut의 답변에 포함된 내부 변수 "$SEConds"와 내부 서버 오류에 대한 답변에 포함된 SSC의 원라인을 조합하면 다음과 같습니다.
SECONDS=0
sleep 2s
echo "Elapsed time: $((SECONDS/3600))h $(((SECONDS/60)%60))m $((SECONDS%60))s"
이것은 오래된 게시물이고 모두가 여기에 코드를 너무 많이 쓰는 것을 좋아하는 것 같다.그러나 실제로는 3줄의 간단한 bash 코드만 있으면 적절한 포맷으로 경과시간을 표시할 수 있습니다.
START_TIME=$(date +%s)
# put your code here
ELAPSED=$(($(date +%s) - START_TIME))
printf "elapsed: %s\n\n" "$(date -d@$ELAPSED -u +%H\ hours\ %M\ min\ %S\ sec)"
그 결과, 다음과 같은 결과가 됩니다.
elapsed: 0 hours 2 min 19 sec
코드를 테스트합니다.
START_TIME=$(date +%s)
ELAPSED=86399
printf "elapsed: %s\n\n" "$(date -d@$ELAPSED -u +%H\ hour\ %M\ min\ %S\ sec)"
elapsed: 23 hour 59 min 59 sec
날짜도 표시할 경우 날짜를 올바르게 표시하기 위해 약간의 트릭을 수행해야 합니다.
ELAPSED=86399
printf "elapsed: %s\n\n" "$(date -d@$ELAPSED -u +%d\ days\ %H\ hour\ %M\ min\ %S\ sec)"
elapsed: 01 days 23 hour 59 min 59 sec
ELAPSED=86400
elapsed: 02 days 00 hour 00 min 00 sec
보시다시피 날짜가 잘못 계산되었으므로 다음과 같이 bash에서 연산해야 합니다.
printf "elapsed: %s day %s\n\n" "$(($(date -d@$ELAPSED -u +%d)-1))" "$(date -d@$ELAPSED -u +%H\ hour\ %M\ min\ %S\ sec)"
elapsed: 1 day 00 hour 00 min 00 sec
그\
날짜-시간 패턴의 문자는 공백에서 제외됩니다.
도움이 되길 바랍니다.
start=$(date +%Y%m%d%H%M%S);
for x in {1..5};
do echo $x;
sleep 1; done;
end=$(date +%Y%m%d%H%M%S);
elapsed=$(($end-$start));
ftime=$(for((i=1;i<=$((${#end}-${#elapsed}));i++));
do echo -n "-";
done;
echo ${elapsed});
echo -e "Start : ${start}\nStop : ${end}\nElapsed: ${ftime}"
Start : 20171108005304
Stop : 20171108005310
Elapsed: -------------6
#!/bin/bash
time_elapsed(){
appstop=$1; appstart=$2
ss_strt=${appstart:12:2} ;ss_stop=${appstop:12:2}
mm_strt=${appstart:10:2} ;mm_stop=${appstop:10:2}
hh_strt=${appstart:8:2} ; hh_stop=${appstop:8:2}
dd_strt=${appstart:6:2} ; dd_stop=${appstop:6:2}
mh_strt=${appstart:4:2} ; mh_stop=${appstop:4:2}
yy_strt=${appstart:0:4} ; yy_stop=${appstop:0:4}
if [ "${ss_stop}" -lt "${ss_strt}" ]; then ss_stop=$((ss_stop+60)); mm_stop=$((mm_stop-1)); fi
if [ "${mm_stop}" -lt "0" ]; then mm_stop=$((mm_stop+60)); hh_stop=$((hh_stop-1)); fi
if [ "${mm_stop}" -lt "${mm_strt}" ]; then mm_stop=$((mm_stop+60)); hh_stop=$((hh_stop-1)); fi
if [ "${hh_stop}" -lt "0" ]; then hh_stop=$((hh_stop+24)); dd_stop=$((dd_stop-1)); fi
if [ "${hh_stop}" -lt "${hh_strt}" ]; then hh_stop=$((hh_stop+24)); dd_stop=$((dd_stop-1)); fi
if [ "${dd_stop}" -lt "0" ]; then dd_stop=$((dd_stop+$(mh_days $mh_stop $yy_stop))); mh_stop=$((mh_stop-1)); fi
if [ "${dd_stop}" -lt "${dd_strt}" ]; then dd_stop=$((dd_stop+$(mh_days $mh_stop $yy_stop))); mh_stop=$((mh_stop-1)); fi
if [ "${mh_stop}" -lt "0" ]; then mh_stop=$((mh_stop+12)); yy_stop=$((yy_stop-1)); fi
if [ "${mh_stop}" -lt "${mh_strt}" ]; then mh_stop=$((mh_stop+12)); yy_stop=$((yy_stop-1)); fi
ss_espd=$((10#${ss_stop}-10#${ss_strt})); if [ "${#ss_espd}" -le "1" ]; then ss_espd=$(for((i=1;i<=$((${#ss_stop}-${#ss_espd}));i++)); do echo -n "0"; done; echo ${ss_espd}); fi
mm_espd=$((10#${mm_stop}-10#${mm_strt})); if [ "${#mm_espd}" -le "1" ]; then mm_espd=$(for((i=1;i<=$((${#mm_stop}-${#mm_espd}));i++)); do echo -n "0"; done; echo ${mm_espd}); fi
hh_espd=$((10#${hh_stop}-10#${hh_strt})); if [ "${#hh_espd}" -le "1" ]; then hh_espd=$(for((i=1;i<=$((${#hh_stop}-${#hh_espd}));i++)); do echo -n "0"; done; echo ${hh_espd}); fi
dd_espd=$((10#${dd_stop}-10#${dd_strt})); if [ "${#dd_espd}" -le "1" ]; then dd_espd=$(for((i=1;i<=$((${#dd_stop}-${#dd_espd}));i++)); do echo -n "0"; done; echo ${dd_espd}); fi
mh_espd=$((10#${mh_stop}-10#${mh_strt})); if [ "${#mh_espd}" -le "1" ]; then mh_espd=$(for((i=1;i<=$((${#mh_stop}-${#mh_espd}));i++)); do echo -n "0"; done; echo ${mh_espd}); fi
yy_espd=$((10#${yy_stop}-10#${yy_strt})); if [ "${#yy_espd}" -le "1" ]; then yy_espd=$(for((i=1;i<=$((${#yy_stop}-${#yy_espd}));i++)); do echo -n "0"; done; echo ${yy_espd}); fi
echo -e "${yy_espd}-${mh_espd}-${dd_espd} ${hh_espd}:${mm_espd}:${ss_espd}"
#return $(echo -e "${yy_espd}-${mh_espd}-${dd_espd} ${hh_espd}:${mm_espd}:${ss_espd}")
}
mh_days(){
mh_stop=$1; yy_stop=$2; #also checks if it's leap year or not
case $mh_stop in
[1,3,5,7,8,10,12]) mh_stop=31
;;
2) (( !(yy_stop % 4) && (yy_stop % 100 || !(yy_stop % 400) ) )) && mh_stop=29 || mh_stop=28
;;
[4,6,9,11]) mh_stop=30
;;
esac
return ${mh_stop}
}
appstart=$(date +%Y%m%d%H%M%S); read -p "Wait some time, then press nay-key..." key; appstop=$(date +%Y%m%d%H%M%S); elapsed=$(time_elapsed $appstop $appstart); echo -e "Start...: ${appstart:0:4}-${appstart:4:2}-${appstart:6:2} ${appstart:8:2}:${appstart:10:2}:${appstart:12:2}\nStop....: ${appstop:0:4}-${appstop:4:2}-${appstop:6:2} ${appstop:8:2}:${appstop:10:2}:${appstop:12:2}\n$(printf '%0.1s' "="{1..30})\nElapsed.: ${elapsed}"
exit 0
-------------------------------------------- return
Wait some time, then press nay-key...
Start...: 2017-11-09 03:22:17
Stop....: 2017-11-09 03:22:18
==============================
Elapsed.: 0000-00-00 00:00:01
언급URL : https://stackoverflow.com/questions/16908084/bash-script-to-calculate-time-elapsed
'source' 카테고리의 다른 글
XAML 마크업만 사용하여 다른 컨트롤을 클릭했을 때 WPF 팝업을 열려면 어떻게 해야 합니까? (0) | 2023.04.17 |
---|---|
N일보다 오래된 파일을 삭제하는 배치 파일 (0) | 2023.04.17 |
Excel 공식에서 문자열 분할 함수 시뮬레이션 (0) | 2023.04.12 |
Windows 명령 프롬프트에서 특정 디렉터리의 파일/하위 폴더를 삭제하는 방법 (0) | 2023.04.12 |
Bash에서 문자열을 소문자로 변환하는 방법 (0) | 2023.04.12 |