在bash脚本中使用grep在日志文件中使用tail -f

时间:2015-06-11 17:31:31

标签: linux bash grep tail

我想为正在写入的日志文件中的特定字符串创建一个grep脚本。我想取第一个结果并将其放入变量中供以后使用。这将通过SSH连接使用,如:

ssh 'user@xxx.xxx.xxx.xxx' 'bash -s' < /usr/local/bin/checklog.sh string

常规终端中的命令

tail -f /var/log/named.log | grep $1 > $var
echo "${var}"

当我尝试上述方法时,没有输出

3 个答案:

答案 0 :(得分:1)

> $var没有按照您的想法行事 它将前一个命令的输出重定向到名称为$var的文件 要捕获命令的输出并将其放入变量,请使用variableName="$(...)"

var="$(tail -f /var/log/named.log | grep $1)"

答案 1 :(得分:1)

使用while循环可能适合您的情况,但请注意,它不能保证捕获日志文件的每一行。考虑一种情况,即日志写入程序包含一个写出两行的操作:

Something bad just happened:\nError xyz on line 22

您的循环很可能只会在执行tail -1操作时看到第二行。

不仅如此,while循环实现意味着您在循环中旋转CPU,不断触发tail命令(在top实现运行时查看while,与tail -f)。

如果您只是想在模式匹配后停止监控,那么

This question有一些很好的建议。 (请注意尾部过程的问题。)

这种怪异可能不是最佳的,但它会捕获每一行,在等待新行时使用最少的CPU,在完成后终止尾部,并使您可以灵活地编写一些额外的逻辑(如执行基于不同匹配模式的行动):

watchPattern=$1
logFile=/var/log/named.log
logLine=""

while read -r logLine ; do
    #Do we have a match?
    if [[ "$logLine" == *"$watchPattern"* ]] ; then
        #Confirmation message, written to console (for example, not needed)
        echo "Found a match."
        #Kill off the tail process  (a bit of a hack that assumes one at a time)
        kill $(ps -eo pid,command | awk -v pattern="tail -fn0 $logFile" '$0 ~ pattern && !/awk/ {print $1}')
        #Get out of here
        break
    fi
done< <(exec tail -fn0 "$logFile")

#logLine will be the matched value
echo "match = $logLine"

答案 2 :(得分:-1)

谢谢大家的意见。你帮助找到了一个更好的方法,使用while和tail而不使用-f

werd=$1
var=""
while [ "${var}" == "" ]
do
var=$(tail -1 /var/log/named.log | grep "${werd}");
done
echo "${var}";

这只是读取文件中的最后一行。由于正在写入文件,最后一行会更改,这是我要查找的结果。

相关问题