【发布时间】:2020-01-10 00:56:50
【问题描述】:
我有一个这样的日志文件:
2019-10-15 13:35:46.823 INFO : xxx
2019-10-15 13:35:46.886 INFO : yyy
2019-10-15 13:35:46.943 INFO : zzz
2019-10-15 13:35:47.822 INFO : aaa
2019-10-15 13:35:48.824 INFO : bbb
我需要找出连续行的时间戳之间的时间差(以毫秒为单位),并按时间差排序(第一行被忽略)
2019-10-15 13:35:46.823 1571117746823
2019-10-15 13:35:48.824 1002
2019-10-15 13:35:47.822 879
2019-10-15 13:35:46.886 63
2019-10-15 13:35:46.943 57
我可以通过编写类似的 bash 脚本来做到这一点
lastEpoch=0
while read p; do
logTime=$(echo $p | cut -c1-24)
currentEpoch=$(date -d "$logTime" +%s%3N)
log="$log $logTime$((currentEpoch-$lastEpoch))"$'\n'
lastEpoch=$currentEpoch
done < my.log
echo -e "$log" > tmp.log
sort -nrk3 tmp.log
但是运行脚本需要很长时间,因为我的原始日志文件有 1M 行,我想我没有使用最有效的方法来执行此操作
我认为 awk 可以有效地做到这一点,但我对 awk 很陌生,有人可以给我提示如何在 awk 上做到这一点..?还是有更有效的方法?
【问题讨论】:
-
我会在不排序的情况下运行脚本,看看它持续了多长时间,以便知道是排序操作繁重还是日期转换。
-
我想知道您的代码
$((currentEpoch-$lastEpoch))是否不应该是$(($currentEpoch-$lastEpoch))(注意 bash 表达式开头的“$”符号。 -
@PierreFrançois 是的,缺少 $,不知道为什么脚本在这种情况下仍然有效
-
我刚刚发现 '$' 在 bash 表达式中不是强制性的。所以,如果
a=2;b=5你可以发出echo $(($a + $b))以及echo $((a + b))。