使用 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

每个日志文件都有最后三行realusersys。我想从我的日志文件中提取所有这些内容并添加它们并以某种格式输出HH:MM:SS。我试图使用catand来实现这一目标,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

相关内容