我想为正在写入的日志文件中的特定字符串创建一个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}"
当我尝试上述方法时,没有输出
答案 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}";
这只是读取文件中的最后一行。由于正在写入文件,最后一行会更改,这是我要查找的结果。