我有一个日志文件,我需要计算两个作业之间的时间差。
在我的日志文件中,我应该计算作业incoming request
和candidate list sent for
之间的时间,在下面的日志中以 2 秒为例;
2019-08-23 00:05:27 42303: incoming request: 1dd5.073f.5d5f0397 (156074 bytes)
2019-08-23 00:05:27 42303: store file: /papillon1/vrf/rq/1dd5.073f.5d5f0397.rq, len: 156074
2019-08-23 00:05:27 42303: registering process 42605 left to finish it's work
2019-08-23 00:05:27 42605: making search request for: 1dd5.073f.5d5f0397
2019-08-23 00:05:27 42605: 1dd5.073f.5d5f0397 is request for search by fingers
2019-08-23 00:05:27 42605: portions: 156
2019-08-23 00:05:27 42605: request pattern version 8
2019-08-23 00:05:27 42605: fingers mask: 1111111111; quality mask: 3011031110
2019-08-23 00:05:27 42605: saving request file: /papillon1/vrf/rqm/1dd5.073f.5d5f0397.rqm~
2019-08-23 00:05:27 42605: renaming request file: /papillon1/vrf/rqm/1dd5.073f.5d5f0397.rqm~ -> /papillon1/vrf/rqm/1dd5.073f.5d5f0397.rqm
2019-08-23 00:05:27 42605: request file saved /papillon1/vrf/rqm/1dd5.073f.5d5f0397.rqm
2019-08-23 00:05:27 42605: request is in queue: 1dd5.073f.5d5f0397
2019-08-23 00:05:27 42605: request 1dd5.073f.5d5f0397 registering time: 663 msec
2019-08-23 00:05:28 42303: waiting for 42605 to be finished
2019-08-23 00:05:28 42303: 42605 finished; waiting time: 0 ms
2019-08-23 00:05:29 43188: candidate list for 1dd5.073f.5d5f0397; 2 records
2019-08-23 00:05:29 43188: candidate list file size: 381
2019-08-23 00:05:29 43188: candidate list sent for: 1dd5.073f.5d5f0397
所以我创建了一个脚本来读取日志文件中的所有 map ,并在该 map 的 2 个作业之间进行计算。上面的日志中1dd5.073f.5d5f0397
以一张 map 为例。
还有我的完整脚本;
#!/bin/bash
for i in `grep 'incoming request:' a8.svrf.ear | sed 's/^.*: //' | awk -F'[ ]' '{print $1}'`
do
var0=$i
TIME1=`grep 'incoming request:' a8.svrf.ear | awk -F'[ ]' '{print $2}'`
TIME2=`grep 'candidate list sent for:' a8.svrf.ear | grep $var0 | awk -F'[ ]' '{print $2}'`
SEC1=`date +%s -d ${TIME1}`
SEC2=`date +%s -d ${TIME2}`
DIFFSEC=`expr ${SEC2} - ${SEC1}`
echo Map ${var0} >> /home/st/anil/test.txt
echo Start ${TIME1} >> /home/st/anil/test.txt
echo Finish ${TIME2} >> /home/st/anil/test.txt
echo Took ${DIFFSEC} seconds >> /home/st/anil/test.txt
echo Took `date +%H:%M:%S -ud @${DIFFSEC}` >> /home/st/anil/test.txt
echo =========================================================================
done
在我的代码中,我基本上尝试使用 for 循环获取所有 map ,并且对于每张 map ,我尝试为 2 个作业获取时间并找出时差,但我的输出是意想不到的;
=========================================================================
date: extra operand ‘00:05:27’
Try 'date --help' for more information.
date: option requires an argument -- 'd'
Try 'date --help' for more information.
date: invalid date ‘@-’
=========================================================================
如果你们指出我的错误,我会很高兴。谢谢
最佳答案
改用 gawk:
gawk '
/incoming request:/ {
d[$6]=mktime(gensub(/[-:]/," ","g",$1" "$2))
next
}
/candidate list sent for:/&&($8 in d){
print $8,mktime(gensub(/[-:]/," ","g",$1" "$2))-d[$8]
}' OFS="\t" a8.svrf.ear
此答案基于 chat 中提供的信息由 OP.
关于linux - Bash 时差计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57645878/