1

我有两个日志文件。

日志文件“出”:

  • 一个记录远程“请求”
  • 线路多,只值得追踪从TRX开始
  • TRX Sent: 02-000330408-01 Type: N Timestamp: 20130322-11474100

日志文件“获取”:

  • 记录“回应”
  • 很多行,只有一个值得跟踪以 PROC 开头
  • PROC: 02-000330408-01 T/S: 20130322 11474500

如果您注意到这些示例,则时间戳差异应该很小。问题是有时遥控器会停止响应。

我在 bash 方面做得越来越好,但我不知道有一个比较两个时间戳的好方法。基本上我正在寻找的是:

if DateDiff(TRX and PROC) > 15 minutes: Do Something Amazing
4

2 回答 2

1

您可以使用sed将时间戳转换为(GNU)date可以接受的格式。因此,如果您可以在 AIX 系统上获取 GNU 日期,您可以这样做:

function toDateFormat() {
    local ts=$(echo "$1" | sed -E "s/$2.*Timestamp: ([0-9-]+)/\1/")

    ts=$(echo "$ts" | sed -E  "s/([0-9]{8})-([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1 \2:\3:\4/g")

    echo "$ts"
}

function compareLines() {
    local ts_a=$(date -d "$(toDateFormat "$1" "TRX")" +%s)
    local ts_b=$(date -d "$(toDateFormat "$2" "PROC")" +%s)

    local diff=$((ts_a-ts_b))

    if [[ diff -le 0 ]] ;
    then
        diff="$((0-diff))"
    fi

    echo "$diff"
}

A="TRX Sent: 02-000330408-01 Type: N Timestamp: 20130322-11474100"
B="PROC Sent: 02-000330408-01 Type: N Timestamp: 20130322-11374100"

res=$(compareLines "$A" "$B")

if [[ "$res" -ge $((15*60)) ]] ;
then
    echo "Do crazy stuff!"
fi
于 2013-03-22T19:01:50.170 回答
1

我认为我有这个工作,作为我的实际问题的轻微变化:

#!/usr/bin/perl -s
use Time::Local;

$OUT = `tail -500 /log/out.log | grep ^TRX  | tail -1 | cut -c46-62`;
$GET = `tail -500 /log/get.log | grep ^PROC | tail -1 | cut -c28-45`;
my $Start = getDate($OUT);
my $Finish = getDate($GET);

$DiffS = ( $Finish - $Start );
$DiffM = ( $Finish - $Start ) / 60;

print "$DiffS\n";
exit($DiffS);

sub getDate {
  $Y = substr $_[0], 0, 4;
  $M = substr $_[0], 4, 2;
  $D = substr $_[0], 6, 2;
  $h = substr $_[0], 9, 2;
  $m = substr $_[0], 11, 2;
  $s = substr $_[0], 13, 2;

  return timelocal($s,$m,$h,$D,$M,$Y);
}

虽然这不是我所要求的,但它允许我给出一个差异,我可以在已经设置为的 shell 脚本中使用它if $I > $Diff then DO MAGICALLY THINGS

#!/bin/ksh
result=$(/usr/bin/logDiff)
print $result
if $result > 60
    ...
于 2013-03-22T20:36:44.987 回答