通过管道传输到"grep -m1" "tail -f <file>"在第一场比赛中未退出



假设我有这个文件内容:

1 lots
2 of
3 content
4 above
5
6 My match string
7 =======================
8
9 other
10 content
11 below

我想要"我的匹配字符串"的行号。

有一些事实: (1(. 匹配字符串在文件中只出现一次。 (2(. 运行脚本时文件可能不存在。 (3(.文件可能真的很大,它的生成需要时间,而这一行在生成后几秒钟后才会写入。

我的 bash 脚本必须包含一个生成文件的命令,然后找到上面提到的行号:

我的脚本如下所示:

<command to generate file>
if file exists 
tail -f -n +1 my_log_file | grep "My match string" -nm1

对于需要时间生成的大文件,此命令有效。 tail -f 将内容管道传输到 grep,一旦此匹配字符串写入文件,-m1 就会使 grep 成功退出(即在第一次匹配时(。

但是对于小文件,grep 正确匹配并打印匹配,但直到我按 ctrl+c 才出来

为什么会有这种行为差异,知道如何解决这个问题吗? 谢谢

摆脱无用的tail

发生的事情是

  • grep按原样存在,但是

  • tail -f不会退出,直到它尝试向管道写入一些内容并注意到没有人从中读取。

最新更新