我想从所有.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
and来实现这一目标,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