【问题标题】:"tail -f <file>" piped to "grep -m1" is not exiting on first match管道到“grep -m1”的“tail -f <file>”在第一次匹配时没有退出
【发布时间】:2023-03-12 01:37:01
【问题描述】:

假设我有这个文件内容:

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

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

【问题讨论】:

    标签: bash grep


    【解决方案1】:

    摆脱无用的tail

    会发生什么

    • grep 应该存在,但是

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

    【讨论】:

    • 由于文件是即时生成和写入的,tail -f 对我来说是最好的选择。是否有任何可能的替代方案?
    • 也许可以帮助tail 确保有足够的数据?例如,将标头写入日志文件?你真的应该在Unix & Linux SE上问这个问题。
    • 如果我们知道最大上限,我看到超时 2 tail -f -n+1 build-psf.sh | grep -m1 "复制打包内容"
    • 这只是通过保持超时限制来确保命令不会永远挂起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多