命令行脚本或实用程序,用于预先添加日志文件中每个条目的已用时间?

时间:2015-12-10 21:17:23

标签: linux shell logging awk ansible

我正在使用一些Ansible日志来查找哪些任务在特定的剧本中花费的时间最多。每个日志行按以下格式列出事件开始的时间:

2015-11-17 14:26:41,643 p=4380…
2015-11-17 14:26:41,716 p=4380…
2015-11-17 14:28:17,449 p=4539…
2015-11-17 14:28:17,449 p=4539…

我正在寻找一个快速命令行实用程序或脚本,它将在每行之前添加(或追加)一行与后续行之间经过的时间。

这似乎应该是Awk的理想工作。但我不确定Awk如何从下一行访问一个字段。我虽然对任何解决方案持开放态度。

2 个答案:

答案 0 :(得分:3)

您可以保存最后一行,然后从以下行中减去。我留给你格式化时间,以便你可以正确地减去它们。以下是从第n行中减去第n-1行的代码:

# example file:
some_lines.txt
1.50
2.35
7.15
10.20

# awk command:
# for line 1 (FNR==1), take the value $1 into variable n, move to next
# for the remaining lines, subtract the last line = n from the current line = $1
# print the result
$ awk 'FNR==1{n=$1;next}{print $1 - n}{n=$1}' some_lines.txt
0.85
4.8
3.05

您需要格式化时间,或者使用awk,就像最后一位评论者建议的那样(但我认为这里存在问题,因为它结合了小时,分钟和秒并执行小数计算),或者在您写入之前文件,以便减法给出合理的结果。

答案 1 :(得分:3)

GNU awk具有内置时间函数

gawk '
    function to_time(datetime) { 
        n = split(datetime, a, /[- :,]/) 
        timespec = a[1]" "a[2]" "a[3]" "a[4]" "a[5]" "a[6] 
        return mktime(timespec) + a[7]/1000 
    } 
    NR == 1 { 
        t1 = to_time($1" "$2) 
        prev = $0 
        getline 
    } 
    { 
        t2 = to_time($1" "$2)
        printf "%7.3f %s\n", t2-t1, prev
        t1 = t2
        prev = $0
    }
    END {printf "%7s %s\n", "n/a", $0}
'

根据您的输入,此输出

  0.073 2015-11-17 14:26:41,643 p=4380…
 95.733 2015-11-17 14:26:41,716 p=4380…
  0.000 2015-11-17 14:28:17,449 p=4539…
    n/a 2015-11-17 14:28:17,449 p=4539…