Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash时差计算_Linux_Bash_Shell_Time - Fatal编程技术网

Linux Bash时差计算

Linux Bash时差计算,linux,bash,shell,time,Linux,Bash,Shell,Time,我有一个日志文件,我需要在两个作业之间进行一些计算,以找出时间差 在我的日志文件中,我应该计算作业传入请求和发送的候选列表之间的时间,下面的日志中以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

我有一个日志文件,我需要在两个作业之间进行一些计算,以找出时间差

在我的日志文件中,我应该计算作业传入请求和发送的候选列表之间的时间,下面的日志中以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
因此,我创建了一个脚本,读取日志文件中的所有地图,并在两个作业之间对该地图进行计算。在上面的日志中,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循环获取所有映射,对于每个映射,我尝试获取两个作业的时间并找出时间差,但我的输出是意外的

=========================================================================
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 ‘@-’
=========================================================================

如果你们能证明我的错误,我会很高兴的。谢谢

您很可能安装了错误的日期版本

您可以运行date-version,您应该会得到与此类似的输出

日期GNU coreutils 8.28 版权所有C 2017自由软件基金会,Inc. 许可证GPLv3+:GNU GPL版本3或更高版本。 这是自由软件:您可以自由更改和重新发布它。 在法律允许的范围内,不存在任何担保。 大卫·麦肯齐撰稿

date+%s-d选项仅适用于date的gnu版本

如果您没有此版本的date,则只需安装它,代码就会正常运行

对于Mac OS X,请使用brew安装coreutils并使用gdate而不是date,因为这是GNU版本

这是我运行它时得到的结果

地图1dd5.073f.5d5f0397 00:05:27开始 完成时间:00:05:29 花了2秒钟 采取00:00:02

改为使用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

这个答案基于OP.

中提供的信息。复制并粘贴您的脚本到@oguzismail实际上我使用了xclock,并且当我的脚本逐行读取它时,++grep'传入请求:'a8.svrf.ear++sed's/^.*://'++awk'-F[]''{print$1}'+for I in'grep'\传入请求:'\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它一直从中读取时间。其中一些地图正在破坏您的脚本。输入可能不像您假设的那样一致。请尝试设置-X以查看发生错误时传递到日期的参数。-d${TIME1}应为-d${TIME1}还可以查看、U&L.SE、SO、AskU等。我在CentOS Linux 7.6.1810版Core上有日期GNU coreutils 8.22