【问题标题】:Bash Time Difference CalculationBash 时差计算
【发布时间】:2019-08-25 12:07:49
【问题描述】:

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

在我的日志文件中,我应该计算作业 incoming requestcandidate 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}"

标签: linux bash shell time


【解决方案1】:

改用 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 在chat 中提供的信息。

【讨论】:

    【解决方案2】:

    您很可能安装了错误的date 版本。

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

    date (GNU coreutils) 8.28 Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by David MacKenzie

    date +%s -d 选项仅适用于 gnu 版本的 date。 http://man7.org/linux/man-pages/man1/date.1.html

    如果您没有此版本的date,那么您只需安装它,您的代码就会运行良好。

    对于 Mac OS X,使用 brew install coreutils 并使用 gdate 代替 date,因为这是 GNU 版本。

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

    Map 1dd5.073f.5d5f0397 Start 00:05:27 Finish 00:05:29 Took 2 seconds Took 00:00:02

    【讨论】:

    • 我在“CentOS Linux release 7.6.1810 (Core)”上有“date (GNU coreutils) 8.22”
    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 2013-09-05
    • 2021-11-27
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多