我有一个文本日志文件,格式如下
Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: xxxxx xxxxxx xxxxx
所以我想在最后几分钟运行cron job来查找某些错误消息。我写了以下命令
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到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脚本中有什么问题。非常感谢提前!
答案 0 :(得分:6)
这里的问题是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'
试试约会 - 帮助&#39;了解更多信息。
问题是您需要将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 ...)"
:
$( )
用于流程替换,因为backticks ` are almost deprecated, ir at least considered legacy。date=" things "
,以防止内容有空格时出错。v var=value
在-v
之后使用空格,因为-vvar=value
特定于gawk。