【问题标题】:awk/bash compare timestamp and sort time diff across rowawk/bash 跨行比较时间戳和排序时间差异
【发布时间】: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))

标签: linux bash shell awk


【解决方案1】:

请您尝试关注一下。

awk -F' INFO|: ' '
{
  split($1,array,"[- :.]")
  current=mktime(array[1] " " array[2] " " array[3] " " array[4] " " array[5] " " array[6]) * 1000 + array[7]
  print $1,$2,current-prev
  prev=current
}
' Input_file  | sort -r -nk3

【讨论】:

    【解决方案2】:

    您可以在 bash 中执行此操作并使用 while read 循环和 date 转换日期以将日期转换为秒,然后从先前的值中减去它并打印。但是,正如您所发现的,为每一行调用 date 非常非常慢。

    可以在awkmktime函数中计算出差值,但是你要先转换成mktime可以吃的格式。然后排序。

    awk '{
        match($1 " " $2, /([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+):([0-9]+)\.([0-9]+)/, t)
        now = mktime(t[1] " " t[2] " " t[3] " " t[4] " " t[5] " " t[6]) * 1000 + t[7] 
        diff = now - prev
        prev = now
        print $1 " " $2 " " diff
    }' | sort -r -n -k3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多