2013-03-22 20 views
1

我有两个日志文件。AIX Bash比较日期时间字符串

日志文件 “内外兼修”:

  • 一个记录远程 “请求”
  • 许多线,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 
+0

这可以相对三立与GNU日期做了区别,但没有日这在AFAIK上有点痛苦。 Perl会做到这一点(用'Time :: Local'应该是可用的)。 – Mat 2013-03-22 16:58:55

+0

我一直在bash工作,但我知道它有Perl ...我会研究时间::本地 – WernerCD 2013-03-22 17:00:22

+0

http://www.unix.com/unix-advanced-expert-users/31152-time -difference.html可以为灵感提供帮助 – Mat 2013-03-22 17:02:28

回答

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 
    ... 
+1

不错 - 但为什么'退出($ Diffs)'? 'exit(0)'会更合适。 – Mat 2013-03-23 07:28:37

+0

你是对的。我在尝试找出将Perl脚本输出到变量中的正确方法时遇到了Bash脚本的问题......这是我后来想到的。我只需要打印,所以退出实际上是不必要的。 – WernerCD 2013-03-23 16:21:01

1

您可以使用sed的时间戳Munge时间成(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 
+0

当我搞砸现场系统的时候,我会变得非常小心,所以我总是努力不去安装那些已经不存在的东西。我想我在Perl脚本中有一些工作可以返回秒差,用于我正在重用的另一个脚本中,但我会看看这个(和GNU日期,我认为我没有) – WernerCD 2013-03-22 20:29:29