查找文件的最后一行以匹配字符串?

查找文件的最后一行以匹配字符串?

我想要一个在文件上无限运行的循环,但总是检查最后一行以查看它是否包含匹配的字符串,如果包含,则回显该行并保持循环运行。我现在所拥有的不起作用,我收到 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)

相关内容