bash - “尾-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 才出来
为什么这种行为差异,知道如何解决这个问题吗?谢谢
解决方案
摆脱无用的tail
。
发生的事情是
grep
它应该存在,但是tail -f
直到它尝试向管道写入某些内容并注意到没有人从中读取时才会退出。
推荐阅读
- android - 使用 Kotlin 多平台实现相机库
- node.js - User.save().then((doc)=>{..}).catch((err)=>{}) 和 save((err,doc)=>{...}) 有什么区别
- javascript - 每次单击时如何阻止我的模态显示?
- django - 如何在 django-admin users 表中显示列 ID?
- php - jquery ajax返回true但未在php中显示正确的消息
- php - 如何使用sql搜索搜索多个关键字
- java - 由于预期条件失败而面临错误:等待警报出现(尝试 5 秒,间隔 500 毫秒)
- javascript - ThreeJS不同形状的对象纹理不起作用
- python - Apache NiFi:使用 ExecuteScript 处理器处理多个 csv
- c - 计数值未保存到新声明的变量中