【问题标题】:date: extra operand %d' error日期:额外操作数 %d' 错误
【发布时间】:2016-08-25 12:38:22
【问题描述】:

我有一个文本日志文件,格式如下

Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: xxxxx xxxxxx xxxxx

所以我想在最近几分钟内运行 cron 作业以查找某些错误消息。我写了以下命令

awk -vDate=`date +%b %d %H:%M:%S %Y` -vDate2=`date --date="2 minutes ago" +%b %d %H:%M:%S %Y` '$5 > Date && $5 < Date2' /var/log/dummy.log  | grep "Fatal"

在上面的命令中,我用字符串Fatal 搜索在时间现在和 2 分钟前有时间戳的消息。

但我收到以下错误

date: extra operand %d'
Try date --help' for more information.
date: extra operand %d'
Try date --help' for more information.

如果我运行日期命令,我会得到如下结果

date "+%b %d %H:%M:%S %Y"
Aug 25 15:25:01 2016

date --date="2 minutes ago" +"%b %d %H:%M:%S %Y" 
Aug 25 15:31:42 2016

所以我的 awk 脚本中的日期命令应该没问题。

我还想将发现的 2 分钟内发生的错误消息重定向到一个文件以作为警报邮件发送,但我还没有做到这一点。

请告诉我我的 awk 脚本有什么问题。提前非常感谢!

【问题讨论】:

  • 你到底为什么要用 cron 把它复杂化?这是一个想法;使用 cron 提取自上次运行 cron 以来的所有日志条目,然后将这些条目放入单个文件中。称之为“日志副本”!说真的,如果您想要在日志条目后两分钟内收到电子邮件警报,请不要使用 cron。相反,让日志通过一个守护进程(例如 syslog-ng)路由,该守护进程生成日志条目并向您发送电子邮件警报。
  • 日志不在标准 syslog 中,所以我不能使用 syslog-ng。

标签: shell date awk


【解决方案1】:

这里的问题在于date 本身。让我们看看如何。

你是说:

vDate2=`date --date="2 minutes ago" +%b %d %H:%M:%S %Y`

因为你想用

date --date="2 minutes ago" +%b %d %H:%M:%S %Y

但是,如果您尝试运行它,您会看到错误:

日期:额外的操作数“%d”
尝试“date --help”以获取更多信息。

问题是您需要用双引号将 FORMAT 控件括起来:

#                             v                  v
$ date --date="2 minutes ago" "+%b %d %H:%M:%S %Y"
Aug 25 14:49:31 2016

完成此操作后,您的完整 awk 单行就可以:

awk -v Date="$(date "+%b %d %H:%M:%S %Y")" \
    -v Date2="$(date --date="2 minutes ago" "+%b %d %H:%M:%S %Y")" \
     '$5 > Date && $5 < Date2' file

注意我使用的是-v Date="$(date ...)"

【讨论】:

  • 对。此外,通过在-v 之后使用不带空格的-vDate=...,您的脚本是特定于gawk 的,并且由于它是特定于gawk 的,因此您根本不需要对date 的外部调用,您可以只使用gawks 内置时间函数: awk 'BEGIN{fmt="%b %d %H:%M:%S %Y"; Date=strftime(fmt); Date2=strftime(fmt,systime()-120)} $5 &gt; Date &amp;&amp; $5 &lt; Date2' file.
  • 糟糕,没有看到你的答案!
  • 是的,行 -v Date="$(date "+%b %d %H:%M:%S %Y")" 解决了错误“额外操作数”。谢谢。但是我的条件“$5 > Date && $5
  • @ShuqinLi-Kokko 请用一些相关数据更新您的问题,以便我进行测试。否则我帮不了你。
  • 您好 fedorqui,感谢您的帮助。例如,我的日志文件中有以下日志条目行: Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: abcd efddf Thu Aug 25 15:19:01 2016 [ info ]: xvbdfdre dfdfd 2016 年 8 月 25 日星期四 15:19:11 [信息]:致命错误 2016 年 8 月 25 日星期四 15:19:41 [信息]:dfdfdfd。如果现在时间是 2016 年 8 月 25 日 15:19:41,我想在 15:19:41 到 15:17:41 之间找到我的日志文件中那些有“致命错误”的行。因此,当前时间应该从日期开始,x 分钟前应该从“日期“x 分钟前”开始,以便从应用程序日志中找到某些错误消息。
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多