【发布时间】:2016-10-18 14:23:02
【问题描述】:
我有以下格式的日志文件:
20:15:35 start opsdfslkdfflkjsdlkfjlsdkfj
20:17:21 lkjlkj lklkjlkjlkjlkjlkjlkjlkjlkj
.
.
.
20:34:11 end kljsdklasjdlaksjdasdasd
20:36:20 start lksadjlaskjdalksdj
.
.
etc
在解析此文件的结果中,我想获得后续 start 和 end 条目之间的时间差。为了保持一致性,它应该在 bash 中完成(其他日志解析是在 bash + 使用 gnuplot 绘图中完成的)。但是通过将文件重定向到while循环然后使用例如awk 将时间戳转换为秒会使整个解析非常慢(可能是由于每行都创建了新的子进程)。
while read line; do
if [[ $string == *"start"* ]]
then
start=$(echo $line | awk '{print $1}' | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')
echo $start
fi
done <log.txt
任何想法如何在 bash 中有效地完成?
【问题讨论】:
-
您每行运行一次 awk?这太疯狂了。运行一次 awk 来处理整个文件,而不是每行输入一次。
-
或者你可以在本地 bash 中进行数学运算——它比使用一个 awk 实例来做所有事情要慢,但比每行一个 awk 实例要快。
-
修正,顺便说一句,涵盖识别对和打印增量 - 在本机 bash 和 awk 中。
标签: bash performance parsing awk