Bash:如何在不带date-d选项的Solaris上比较两个日期 [英] bash: How to compare two dates on Solaris without date -d option

查看:0
本文介绍了Bash:如何在不带date-d选项的Solaris上比较两个日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将从日志文件的各行输入的日期与昨天的日期进行比较,如果差异超过一天,则打印日志文件中的该行。

日志文件:

$more ActiveX2Alarms.log
2016-09-30 01:40:14 MET;faultManager:network@ET_AO_L_0165_abcde@eNBEquip@eNBInst@x2Grp-0@x2Access-0_424_02_ET_AO_L_0165_abcde_44159@x2Transp-0|alarm-2632-3-698;ET_AO_L_0165_abcde;major;2632
;lte.IK4009022;3;698
2016-11-01 08:10:51 MET;faultManager:network@ER_AO_L_4283_abcde@eNBEquip@eNBInst@x2Grp-0@x2Access-0_424_02_ER_AO_L_4283_abcde_14179@x2Transp-0|alarm-2632-3-698;ER_AO_L_4283_abcde;minor;2632;lte.IK4009022;3;698
2017-01-03 12:14:31 MET;faultManager:network@EM_AO_L_4065_abcde@eNBEquip@eNBInst@x2Grp-0@x2Access-0_424_02_EM_AO_L_4065_abcde_44094@x2Transp-0|alarm-2632-3-698;EM_AO_L_4065_
abcde;minor;2632;lte.IK4009022;3;698

我已经使用cygwin在Windows上创建了测试环境。 在Cygwin,我有成功的O/P。

以下是我使用的初始代码:

awk -v d="$(date -d "yesterday" +'%Y-%m-%d %H:%M:%S')" '$1 " " $2 < d' /cygdrive/f/Script_X2/Final/Last_Trial/ActiveX2Alarms.log

结果:

2016-09-30 01:40:14 MET;faultManager:network@ET_AO_L_0165_abcde@eNBEquip@eNBInst@x2Grp-0@x2Access-0_424_02_ET_AO_L_0165_abcde_44159@x2Transp-0|alarm-2632-3-698;ET_AO_L_0165_abcde;major;2632
;lte.IK4009022;3;698
2016-11-01 08:10:51 MET;faultManager:network@ER_AO_L_4283_abcde@eNBEquip@eNBInst@x2Grp-0@x2Access-0_424_02_ER_AO_L_4283_abcde_14179@x2Transp-0|alarm-2632-3-698;ER_AO_L_4283_abcde;minor;2632;lte.IK4009022;3;698

但是,在主服务器上使用相同命令时收到错误:

date: illegal option --d

搜索我认为与安装的Solaris程序包有关的错误

$uname -a
SunOS xxxxxx 5.10 Generic_150400-15 sun4u sparc SUNW,SPARC-Enterprise

$date --version
date: illegal option -- version
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]
$date --help
date: illegal option -- help
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]

所以我使用了下面的代码来避免这个问题,但是它没有给出任何输出...所以还是有问题,请帮助!

$awk -v YESTERDAY="`TZ=GMT+20 date +'%d-%m-%Y %H:%M:%S'`" '$1 " " $2 < YESTERDAY' ActiveX2Alarms.log
awk: syntax error near line 1
awk: bailing out near line 1

$/usr/xpg4/bin/awk -v YESTERDAY="`TZ=GMT+20 date +'%d-%m-%Y %H:%M:%S'`" '$1 " " $2 < YESTERDAY' ActiveX2Alarms.log
$

确认昨天变量赋值成功:

$YESTERDAY="`TZ=GMT+20 date +'%d-%m-%Y %H:%M:%S'`"; echo $YESTERDAY
02-01-2017 16:51:26

推荐答案

日志文件和YESTERDAY的日期格式不同,但应该匹配。由于日志文件按Y-M-D顺序排列,因此请使用:

awk -v YESTERDAY="`TZ=GMT+20 date +'%Y-%m-%d %H:%M:%S'`" '($1 " " $2) < YESTERDAY' ActiveX2Alarms.log
                                    ^^^^^^^^ was %d-%m-%Y

在我的测试系统(也是cygwin)上,这给出了您在问题中显示的相同的两行输出。

这是因为awk比较的是字符串,而不是日期,因此日期必须是Y-M-D格式才能按数字排序。awk不会自动将日期字符串转换为实际日期(据我所知)。我在($1 " " $2)中添加了圆括号,以说明您正在生成一个将与另一个字符串进行比较的字符串。

注意:虽然我认为你的TZ=GMT+20黑客攻击很酷,但GMT+20只比MET早19小时,而不是24小时。因此,如果您在一天中的错误时间运行脚本,YESTERDAY将无法正确设置。This answer有一个关于如何在bash中获取昨天的日期而不考虑时区的示例。

这篇关于Bash:如何在不带date-d选项的Solaris上比较两个日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆