Bash &引用;tail-f<;文件>&引用;输送至;grep-m1“;在第一场比赛中没有退出

Bash &引用;tail-f<;文件>&引用;输送至;grep-m1“;在第一场比赛中没有退出,bash,grep,Bash,Grep,假设我有此文件内容: 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脚本必须包含生

假设我有此文件内容:

  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-n+1我的日志文件| grep“我的匹配字符串”-nm1
对于需要时间生成的大文件,此命令有效。 tail-f将管道内容保存到grep,一旦这个匹配字符串被写入文件,-m1将使grep成功退出(即在第一次匹配时)

但是对于小文件,grep会正确匹配并打印匹配结果,但直到我按下ctrl+c时才会显示出来

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

扔掉无用的
尾巴

发生了什么事

  • grep
    应该存在,但是

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


随着文件的生成和写入,tail-f对我来说是最好的选择。是否有任何可能的替代方法?通过确保有足够的数据来帮助
tail
?例如,是否将头写入日志文件?如果我们知道最大上限的话,我看到timeout 2 tail-f-n+1 build-psf.sh | grep-m1“复制打包内容”这只是通过保持超时限制来确保命令不会永远挂起。