我有一个不断更新的日志文件。 有一个更新文件的功能。 操作成功后,功能会在日志文件其他状态1中插入“状态0”。 我要找的是 - 我想写一个监视脚本,它将打开这个日志文件并搜索今天的日期和状态代码。
请注意 - 没有这样的日期分离。昨天和今天的日志存储在同一个文件中。
下面是我试过的示例代码,但我也想搜索今天的日期 -
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 :(得分:1)
尝试
awk "/$current_date/ && /Agent Exited/"
如果您无法立即看到任何输出,可能会发生这种情况,因为tail -f
的stdout在进入管道时会被缓冲。 (这是由libc完成的)。
在Linux上,您可以使用stdbuf
命令调整或禁用此缓冲:
stdbuf -o0 tail -f logfile | awk "/$current_date/ && /Agent Exited/"
上述命令使用零大小的输出缓冲区执行tail -f
,使输出立即显示在屏幕上。 MacOS和BSD也有类似的命令。
<强>更新强>
哦,我错过了你使用的是tail -10
而不是tail -f
。缓冲问题应该不是问题,但是我会保留上面的文字以供您参考。
答案 1 :(得分: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
,因为它是true
的defalut操作。