Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash:如何在没有date-d选项的情况下比较Solaris上的两个日期_Bash_Shell_Date_Awk_Solaris - Fatal编程技术网

bash:如何在没有date-d选项的情况下比较Solaris上的两个日期

bash:如何在没有date-d选项的情况下比较Solaris上的两个日期,bash,shell,date,awk,solaris,Bash,Shell,Date,Awk,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_016

我试图比较日志文件行中输入的日期与昨天的日期,如果差异超过一天,那么它将打印日志文件中的那一行

日志文件:

$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
但是,在主服务器上使用相同命令时,我收到一个错误:

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
$

日志文件和昨天的日期格式不同,但应该匹配。由于日志文件是按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
awk-v昨天=“`TZ=GMT+20日期+'%Y-%m-%d%H:%m:%S'`'($1”“$2)
在我的测试系统(也是cygwin)上,这给出了与您在问题中显示的相同的两行输出

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

小心:虽然我认为你的
TZ=GMT+20
攻击非常酷,但GMT+20只比大都会早19小时,而不是24小时。因此,如果在一天中的错误时间运行脚本,
昨天
将无法正确设置。有一个示例,说明如何在
bash
中获取昨天的日期,而不考虑时区。

如何查找昨天?
由于夏时制,24小时前可以是今天或前天。如果要在不使用GNU日期的情况下更改脚本,请使用以下技巧:

你肯定昨天是20或30个小时前。哪一个?最近的一次不是今天

yesterday=$(printf "%s\n" "$(TZ=GMT+30 date +%Y-%m-%d)" "$(TZ=GMT+20 date +%Y-%m-%d)" |
    grep -v $(date +%Y-%m-%d) | tail -1)
如果您希望看到24小时的差异(并希望包括时间),请使用以下命令

yesterdaynow="${yesterday} $(date +'%H:%M:%S')"
请注意,这可能是23或25小时前切换DST时发生的

注:
当您拥有“新”bash版本时,可以使用其他printf选项,请参阅

使用此选项,您可以将日期转换为历元并计算它们之间的差异。

错误消息
awk:syntax error靠近第1行;awk:在第1行附近救援意味着您正在调用旧的、损坏的awk(/usr/bin/awk on Solaris)。永远不要用那个awk。在Solaris上,使用/usr/xpg4/bin/awk代替您的第二个示例,或者更好地安装GNU awk(这是您在cygwin上使用的),它有自己的内置时间函数,这样您就不需要乱搞
日期
。如果您在Solaris 11或更高版本上,则可以使用GNU date,它支持
-d
选项。这意味着使用
gdate
命令而不是
date
命令。如果您使用的是早期的Solaris,则需要主动安装GNU coreutils包(包括GNU日期)。
yesterday=$(printf "%s\n" "$(TZ=GMT+30 date +%Y-%m-%d)" "$(TZ=GMT+20 date +%Y-%m-%d)" |
    grep -v $(date +%Y-%m-%d) | tail -1)
yesterdaynow="${yesterday} $(date +'%H:%M:%S')"