【发布时间】:2019-08-25 12:07:49
【问题描述】:
我有一个日志文件,我需要在两个作业之间进行一些计算以找出时间差。
在我的日志文件中,我应该计算作业 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
所以我创建了一个脚本来读取日志文件中的所有地图,并在该地图的 2 个作业之间进行计算。在上面的日志中1dd5.073f.5d5f0397是一张地图作为例子。
这也是我的完整脚本;
#!/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 循环获取所有地图,并且对于每个地图,我尝试为 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 ‘@-’
=========================================================================
如果你们能指出我的错误,我会很高兴。谢谢
【问题讨论】:
-
将您的脚本复制并粘贴到shellcheck.net
-
@oguzismail 实际上我使用了 xclock 并且当我的脚本逐行读取它时 ++ grep 'incoming request:' a8.svrf.ear ++ sed 's/^.*: //' ++ awk '-F[ ]' '{print $1}' + for i in '
grep '\''incoming request:'\'' a8.svrf.ear | sed '\''s/^.*: //'\'' | awk -F'\''[ ]'\'' '\''{print $1}'\''' + var0=1dd5.0721.5d5f02b1 ++ grep '传入请求:'a8.svrf.ear ++ awk '-F []''{print $2}' + TIME1='00:01:37 00:05:27 00:09:49 00:11:18 00:12:02 00:12:28 00:12:52 00: 13:24 它一直在读取时间。 -
其中一些“地图”正在破坏您的脚本。输入可能不像您假设的那样一致。尝试
set -X以查看发生错误时将哪些参数传递给date。 -
-d ${TIME1}应该是-d "${TIME1}"