首页 > 解决方案 > “尾-f“管道到“grep -m1”在第一次匹配时没有退出

问题描述

假设我有这个文件内容:

  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 才出来

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

标签: bashgrep

解决方案


摆脱无用的tail

发生的事情是

  • grep它应该存在,但是

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


推荐阅读