Bash를 사용하여 모든 로그 파일에 시간 추가

Bash를 사용하여 모든 로그 파일에 시간 추가

.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. 내 로그 파일에서 이러한 모든 내용을 추출하여 추가하고 어떤 형식으로 출력하고 싶습니다 . 나는 이것을 사용하여 이것을 달성하려고 시도했지만 올바른 결과를 얻지 못했습니다 .usersysHH:MM:SScatgrepregex

고쳐 쓰다

디렉토리를 탐색하려면 다음 코드를 사용합니다.

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

관련 정보