.log
모든 파일에서 시간을 추출하고 이 모든 시간을 하나의 엔터티에 추가하고 싶습니다 . 내 로그 파일은 중첩된 디렉터리에 저장됩니다.
내 로그 파일의 디렉터리 구조:
|-- temp-system
| |-- bash
| | |-- bash-4.3-branch_update-5.patch
| | |-- build.log
| | |-- build.sh
| | `-- DONE
| |-- binutils
| | |-- build.log
| | |-- build.sh
| | `-- DONE
| |-- build-variables
| | |-- build.log
| | |-- build.sh
| | `-- DONE
| |-- bzip2
| | |-- build.log
| | |-- build.sh
| | `-- DONE
| |-- check
| | |-- build.log
| | |-- build.sh
| | `-- DONE
| |-- cloog
| | |-- build.log
| | |-- build.sh
| | `-- DONE
| |-- gettext
| | |-- build.log
| | |-- build.sh
| | `-- DONE
|-- build-system
| |-- gcc
| | |-- build.log
| | |...
내 로그 파일의 일부:
are/man/man1'
make[2]: Leaving directory `/tmp/panda64/temp-system/texinfo/texinfo-5.2/man'
make[1]: Leaving directory `/tmp/panda64/temp-system/texinfo/texinfo-5.2/man'
make[1]: Entering directory `/tmp/panda64/temp-system/texinfo/texinfo-5.2'
make[2]: Entering directory `/tmp/panda64/temp-system/texinfo/texinfo-5.2'
make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/tmp/panda64/temp-system/texinfo/texinfo-5.2'
make[1]: Leaving directory `/tmp/panda64/temp-system/texinfo/texinfo-5.2'
/tmp/panda64/temp-system/texinfo
real 1m59.973s
user 1m26.352s
sys 0m11.820s
각 로그 파일 에는 마지막 세 줄 과 real
. 내 로그 파일에서 이러한 모든 내용을 추출하여 추가하고 어떤 형식으로 출력하고 싶습니다 . 나는 이것을 사용하여 이것을 달성하려고 시도했지만 올바른 결과를 얻지 못했습니다 .user
sys
HH:MM:SS
cat
grep
regex
고쳐 쓰다
디렉토리를 탐색하려면 다음 코드를 사용합니다.
list=(temp-system build-system)
for direcs in ${list[@]}; do
case $direcs in
temp-system )
pushd $direcs
_list1=(bash binutils build-variables)
for subdirecs in ${_list1[@]}; do
case $subdirecs in
* )
# execute code to add the time
# and later add this with other
# time calculated from other directories
;;
esac
done
popd;;
esac
done
답변1
거대한 스크립트 대신 find를 사용하여 파일을 반복할 수 있습니다.
find /var/log -name *.log -exec ls {} \;
필요에 맞게 -exec의 경로와 "ls"를 바꾸십시오.
grep 시간은 다음과 같이 할 수 있습니다.
grep "^real\t" time.txt | awk '{ print $NF }'
하지만 포맷하는 좋은 해결책을 찾을 수 없습니다.
답변2
형식의 시간이 포함된 파일이 있으면 1m59.973s
(예: 출력미카엘 카일의 답변), 합계로 변환할 수 있습니다.BC(1):
( cat alltimes.log | sed 's_h_*3600+_;s_m_*60+_;s_s_+_' | tr -d '\n' ; echo 0 ) | bc
그러면 초(소수점 포함)가 인쇄됩니다. 그런 다음 bash
분해하고 형식을 다시 지정할 수 있습니다(산술 확장은 소수를 처리하지 않습니다).
TOTAL=`( cat alltimes.log | sed 's_h_*3600+_;s_m_*60+_;s_s_+_' | tr -d '\n' ; echo 0 ) | bc`
INT=${TOTAL%.*}
DEC=${TOTAL#*.}
H=$((INT/3600))
M=$((INT/60%60))
S=$((INT%60))
printf %02i:%02i:%02i.%s $H $M $S $DEC