我正在使用一些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如何从下一行访问一个字段。我虽然对任何解决方案持开放态度。
答案 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…