linux - Bash 时差计算

标签 linux bash shell time

我有一个日志文件,我需要计算两个作业之间的时间差。

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

所以我创建了一个脚本来读取日志文件中的所有 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/

相关文章:

c - 在 Linux 内核中从 sk_buff 和 inode 获取 PID

linux - 无法将 Arduino 连接到 NVIDIA Jetson TK1 开发板

bash - 使用复杂命令查找通过管道传输到 xargs

python - IF 语句 : Shell to python

shell - 在 Finder 中选择的文件上执行 shell 命令

shell - 使用 ssh 远程加 grep

bash - 如何编写一个可以切换到 bash 的 shell?

linux - 将 bash 脚本作为守护进程运行

c++ - 使用gdb分析核心转储帧

linux - 按行抓取内容,并固定输出格式