我想要一个在文件上无限运行的循环,但总是检查最后一行以查看它是否包含匹配的字符串,如果包含,则回显该行并保持循环运行。我现在所拥有的不起作用,我收到 grep 错误
#! /bin/bash
echo "Script is starting......."
FILE="/Users/shubhamsinha/Desktop/new_test.log"
# (tail -n1) < FILE
STRING="MYNAME"
while : ;do
Last = tail -F "$FILE"
grep -q "$STRING" "$Last" && echo "FOUND" && break
sleep 5
done
答案1
不用费心去写剧本。这需要一句台词,而不是剧本。
利用现有工具来完成您需要的事情,而不是编写新工具。
只需在命令行中输入:
tail -f -n 1 /Users/shubhamsinha/Desktop/new_test.log | grep MYNAME
解释:
tail -f
在指定文件上永久运行并输出添加到该文件的每个附加行。
-n 1
意味着tail
启动时只会输出文件当前的最后一行,而不是默认的文件的最后 10 行。
|
是一个管道。如果您不了解管道,请放弃所有内容,不要尝试编写更多 shell 脚本,直到您了解管道。 (这不会花很长时间,但至关重要的写出好的剧本。)
grep MYNAME
仅打印其输入中包含模式 MYNAME 的行。
答案2
#! /bin/bash
echo "Script is starting......."
FILE="/Users/shubhamsinha/Desktop/new_test.log"
STRING="MYNAME"
while true; do
tail bar | grep "MYNAME" && echo "FOUND" && break
sleep 5
done
例子
FILE="/home/user1/tmp/bar"
脚本名称是
foo
% ./foo & [1] 12586 Script is starting....... % echo "MYNAME" > ~/tmp/bar % MYNAME FOUND [1] + 12586 done ./foo
答案3
不使用该tail
命令,而是使用awk
来获得完美的输出。
Last = tail -F "$FILE" ===> Last=$(awk '/./{line=$0} END{print line}' $FILE)