2015-04-07 51 views
0

我有一个不断更新的日志文件。 有一个更新文件的功能。 成功操作后,功能会在日志文件中插入“状态0”,其他状态为1. 我在寻找的是 - 我想编写一个监视脚本,它将打开此日志文件并搜索今天的日期和状态代码。用于搜索多个图案的awk命令

请注意 - 没有这样明确的日期分隔。昨天和今天的日志存储在同一个文件中。

下面

是一个示例代码我试过,但我想寻找今天的日期作为受过良好

current_date=`date +%d-%b-%y` 
echo $current_date 
cd /complete/application/logs 

status=`tail -10 agent.log | awk '/"$current_date"/&&/Agent Exited/ {print $0}'` 
echo $status 
if [ "$status" == "<0>" ] 
then 
echo "Log Agent Status on `hostname` is running fine." 
else 
echo "Log Agent status on `hostname` is not running ." 
fi 

请指教。

+0

欢迎来到Stack Overflow。请尽快阅读[关于]页面。在这样的问题中,如果行很长,显示日志文件中的几行或行的截断版本会很有帮助。您还应该显示您显示的数据的预期输出。没有这个,我们就盲目工作,不能可靠地帮助你。日志文件中有多少这样的行?总共有多少条线路,以及退出状态的报告数量?为什么10行而不是100或1? –

+0

当你在上面的命令中设置状态时,状态将如何等于'“<0>”'。它可以是空的或每行匹配。 – 2015-04-07 07:16:28

回答

1

尝试

awk "/$current_date/ && /Agent Exited/" 

如果你不能马上看到任何输出,这可能发生,因为要去管道时的tail -f GET的标准输出缓冲。 (这是由libc完成的)。立即在屏幕上

stdbuf -o0 tail -f logfile | awk "/$current_date/ && /Agent Exited/" 

上述命令大小为零使得输出的输出缓冲器执行tail -f出现:

在Linux中,可以使用命令stdbuf调整或禁用此缓冲。对于MacOS和BSD有一个类似的命令。

更新

哦,我错过了你正在使用tail -10代替tail -f。缓冲问题不应该成为一个问题,然而,我会保留上述文本以供参考。

+0

感谢您的回复。 但它没有返回任何内容:( – Shyam

+1

@klashxx答案是否有效?它应该也是这样。如果没有,请发布我应该匹配的日志行。 –

+0

实际上,您无法确定日志文件中最后一行是什么行。日志文件不断更新。需要检查今天的状态是o还是1 – Shyam

0

修复引用机制:

status=`tail -10 agent.log | awk '/'"${current_date}"'/&&/Agent Exited/ {print $0}'` 

为了避免代码注入肯定会有更好:

awk -v cd="${current_date}" 'match($0,cd) && /Agent Exited/' 

所以您的代码将是这样的:

status=`tail -10 agent.log | awk -v cd="${current_date}" 'match($0,cd) && /Agent Exited/'` 

请注意,您忽略print $0,因为它是awk的defalut动作,当一个快递离子评估为true

+0

为什么你在这方面使用匹配? '$ 0〜cd'就足够了, – 2015-04-07 07:18:55

+0

只是更具可读性@JID – klashxx

+0

不知道我同意但是每个都对自己:) – 2015-04-07 07:27:24