我有这个 bash 脚本来计算应用程序日志文件的最大 tps。该脚本可以工作,但在具有数百万条目的文件上运行需要几个小时。日志条目具有以下模式:
2015-11-01 14:34:20,969 TRACE [Thread-2868] [TrafficLogger] service transaction data
2015-11-01 14:34:20,987 TRACE [Thread-2868] [TrafficLogger] service transaction data
该脚本有一个循环,用于 grep 所有可能的小时:分钟:秒组合,并计算每个组合的匹配数,每次与之前的最高计数进行比较以更新峰值 TPS:
for h in {00..23}; do
for m in {00..59}; do
for s in {00..59}; do
tps=$(grep -c "${h}:${m}:${s}" $log_file)
if [ "$tps" -gt "$peak_tps" ]; then
peak_tps=$tps
fi
done
done
done
这是计算最大 TPS 的直接方法,但我想知道是否有一种方法可以优化它,可能使用一些关于输入的启发式方法:(1)输入文件按时间戳排序; (2) 它仅包含一天的条目(即第一列是恒定的)。
我尝试了几件事:(1)添加--mmap
到grep
; (2) 预先查找所有时间戳并仅搜索那些:
for timestamp in $(awk '{print $2}' $log_file | cut -d \, -f 1 | sort -u); do
tps=$(grep --mmap -c "${h}:${m}:${s}" $log_file)
...
两者都没有取得太大改进。我确信这是一个经典的测试题,但我似乎找不到答案。你们能帮忙吗?
问候!
答案1
以下命令仅从日志文件中截取时间戳(字符 12-19),然后(因为假定它们已排序)运行它,uniq -c
生成每个唯一条目(时间戳)的计数。管道的其余部分只是按第一(计数)列最高优先对结果输出进行排序,然后显示第一个结果。
cut -c12-19 $log_file | uniq -c | sort -rn | head -1
或者,做一个...sort -n | tail -1