我有一个文本日志文件,格式如下
Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: xxxxx xxxxxx xxxxx
Run Code Online (Sandbox Code Playgroud)
所以我想在最后几分钟运行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"
Run Code Online (Sandbox Code Playgroud)
在上面的命令中,我使用字符串搜索具有时间戳和时间戳的消息Fatal.
但是我得到了以下错误
date: extra operand %d'
Try date --help' for more information.
date: extra operand %d'
Try date --help' for more information.
Run Code Online (Sandbox Code Playgroud)
如果我运行日期命令,我得到如下结果
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
Run Code Online (Sandbox Code Playgroud)
所以我的awk脚本中的日期命令应该没问题.
我还想将发现的错误消息重定向2分钟到一个文件以邮件作为警报,但我还没有那么远.
请告诉我我的awk脚本有什么问题.非常感谢提前!
这里的问题date本身就是问题.我们来看看如何.
你是说:
vDate2=`date --date="2 minutes ago" +%b %d %H:%M:%S %Y`
Run Code Online (Sandbox Code Playgroud)
因为你想使用
date --date="2 minutes ago" +%b %d %H:%M:%S %Y
Run Code Online (Sandbox Code Playgroud)
但是,如果您尝试运行它,您将看到您收到错误:
date:额外的操作数'%d'
尝试'date --help'以获取更多信息.
问题是您需要将FORMAT控件括在双引号内:
# v v
$ date --date="2 minutes ago" "+%b %d %H:%M:%S %Y"
Aug 25 14:49:31 2016
Run Code Online (Sandbox Code Playgroud)
完成后,您的完整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
Run Code Online (Sandbox Code Playgroud)
注意我正在使用-v Date="$(date ...)":
$( )对于进程替换,因为反引号几乎被弃用,至少被认为是遗留的.date=" things " 如果内容有空格,以防止错误.v var=value之后使用空格-v,因为-vvar=value是gawk特定的.