假设我有这个文件内容:
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
不会退出,直到它尝试向管道写入一些内容并注意到没有人从中读取。