我想创建一个脚本来查找正在写入的日志文件中的特定字符串。我想获取第一个结果并将其放入变量中以供以后使用。这将通过 SSH 连接使用,如下所示:
ssh '[email protected]' 'bash -s' < /usr/local/bin/checklog.sh string
普通终端中的命令
tail -f /var/log/named.log | grep $1 > $var
echo "${var}"
当我尝试上述方法时,没有输出
Using a while
循环可能适合您的情况,但请注意,它不能保证捕获日志文件的每一行。考虑一种情况,日志编写器包含一个写出两行的操作:
Something bad just happened:\nError xyz on line 22
当你的循环执行时很可能只会看到第二行tail -1
action.
不仅如此,while 循环实现意味着您在循环中旋转 CPU,不断地启动tail
命令(看看top
而while
实施运行,与tail -f
).
这个问题如果您只想在模式匹配后停止监视,有一些好的建议。 (请注意尾部进程悬而未决的问题。)
这个怪物可能不是最佳的,但它捕获每一行,在等待新行时使用最少的 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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)