如何将tail -f | grep的匹配结果存入变量并获取文件末尾首个匹配行
问题根因
tail -f 的设计逻辑是持续追踪文件新增内容,执行后默认不会主动终止进程,而$(...)命令替换需要等待内部命令执行完毕才能捕获输出,因此你原来的写法会一直卡住,无法完成变量赋值。
解决方案
根据你的使用场景选对应方案即可:
方案1:读取现有文件的「从末尾数第一个匹配行」(无需监听新增内容)
用tac命令将文件内容按行倒序输出,搭配grep -m 1匹配到第一个结果就立即终止,刚好匹配你的需求:
val=$(tac linge.org | grep -m 1 "zblank")
参数说明:
tac是cat的反向命令,从文件最后一行往第一行输出内容grep -m 1表示匹配到1条符合要求的结果后就立即退出,命令正常终止后输出就会被捕获到变量val中
方案2:需要监听文件新增内容,等后续写入的第一个匹配行再赋值
如果你的场景是要等待后续新写入到linge.org的匹配行,给grep加-m 1参数即可,匹配到结果后grep会主动退出,触发tail -f收到管道中断信号也同步退出,就能正常捕获结果:
val=$(tail -f linge.org | grep -m 1 "zblank")
如果需要同时扫描现有文件的所有内容再监听新增,给tail加-n +1参数即可:
val=$(tail -n +1 -f linge.org | grep -m 1 "zblank")
内容的提问来源于stack exchange,提问作者Angio
相关产品推荐
相关产品推荐

