Linux:阻塞直到字符串在文件中匹配("tail + grep with blocking")

Ond*_*žka 11 linux grep gnu block

在bash/GNU工具中是否有一些单行方式阻塞,直到文件中有匹配的字符串?理想情况下,超时.我想避免多行循环.

更新:似乎我应该强调我希望在字符串匹配时结束进程.

Ond*_*žka 22

谢谢你的回答,但重要的是这个过程会阻塞直到找到,然后结束.我找到了这个:

grep -q 'PATTERN' <(tail -f file.log)
Run Code Online (Sandbox Code Playgroud)

-q不太便携,但我只会使用红帽企业Linux,所以没关系.并且超时:

timeout 180 grep -q 'PATTERN' <(tail -f file.log)
Run Code Online (Sandbox Code Playgroud)

  • 不知道你为什么说 `-q` 不可移植,它是由 POSIX 指定的。 (2认同)
  • 这个解决方案的问题是即使在grep退出之后,进程'tail'仍然会存活. (2认同)

小智 6

我使用sed而不是grep创建一个变体,打印所有解析的行.

sed '/PATTERN/q' <(tail -n 0 -f file.log)
Run Code Online (Sandbox Code Playgroud)

该脚本位于https://gist.github.com/2377029


Joe*_*Joe 5

看看这个--max-count选项:

tail -f file.log | grep -m 1 'PATTERN'
Run Code Online (Sandbox Code Playgroud)

它将在第一行匹配后退出PATTERN


编辑:请注意下面@Karoly 的评论。如果file.log速度很慢,则进程可能会阻塞,直到在匹配行之后grep将其他内容添加到文件中。

echo 'context PATTERN line' >> file.log  ## grep shows the match but doesn't exit
Run Code Online (Sandbox Code Playgroud)

将打印匹配的行,但直到将其他内容附加到文件后才会退出(即使它还没有换行符):

echo -n ' ' >> file.log  ## Now the grep process exits
Run Code Online (Sandbox Code Playgroud)

在某些情况下(例如高速日志文件),这并不是什么大问题,因为新内容可能很快就会添加到文件中。

另请注意,当从控制台作为 stdin 读取时,不会发生此行为,因此grep从管道读取的方式似乎有所不同:

$ grep -m1 'PATTERN' -      # manually type PATTERN and enter, exits immediately
$ cat | grep -m1 'PATTERN'  # manually type PATTERN and enter, and it hangs
Run Code Online (Sandbox Code Playgroud)

  • 它不会退出 - 你首先必须等到文件中写入内容...... (3认同)