用于搜索多个模式的awk命令

时间:2015-04-07 05:31:33

标签: shell awk

我有一个不断更新的日志文件。 有一个更新文件的功能。 操作成功后,功能会在日志文件其他状态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

请告知。

2 个答案:

答案 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操作。