【问题标题】:AIX Bash Compare datetime stringsAIX Bash 比较日期时间字符串
【发布时间】:2013-03-23 04:36:44
【问题描述】:

我有两个日志文件。

日志文件“输出”:

  • 记录远程“请求”
  • 行多,只值得追踪以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

【问题讨论】:

  • 这可以用 GNU date 相对健全地完成,但如果没有它,AFAIK 会有点痛苦。 Perl 会这样做(Time::Local 应该可用)。
  • 我一直在 bash 中工作,但我知道它确实有 Perl...我会研究一下 Time::Local
  • 时间戳的格式是什么? GNU date 可能会被告知如何转换它;它看起来像 YYYYMMDD-HHMMSS;后面的两位数是百分之一秒吗?
  • @chepner 是的。他们总是 00,所以我想如果需要的话,我可以把这 2 关掉,以获得YYYYMMDDHHMMSS

标签: bash aix


【解决方案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

【讨论】:

  • 在搞乱实时系统时我会变得很紧张,所以我始终致力于不安装任何已经不存在的东西。我想我在一个返回秒差异的 Perl 脚本中有一些工作,用于我正在重用的另一个脚本中,但我会看看这个(和 GNU 日期,我认为我没有)
【解决方案2】:

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

#!/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);
}

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

#!/bin/ksh
result=$(/usr/bin/logDiff)
print $result
if $result > 60
    ...

【讨论】:

  • 很好 - 但为什么要exit($Diffs)exit(0) 会更合适。
  • 你是对的。在试图找出将 Perl 脚本的输出放入变量中的正确方法时,我遇到了 Bash 脚本的问题……我已经弄清楚了。我只需要打印,所以退出实际上是不必要的。
猜你喜欢
  • 1970-01-01
  • 2019-07-25
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多