3

我有一个正在写入标准输出的进程,我希望能够在运行 tail -f 时通过 grepping 各种字符串来监视输出。做到这一点的一种方法是写入一个普通文件,然后将文件 grepping 用于一个字符串,然后将其 grepping 用于另一个字符串。但是,我不想写入文件,因为这会填满磁盘,而且我不想处理轮换日志文件的麻烦。

我以为我可以使用 fifos 来实现这一点。例如,

mkfifo myfifo
foo > myfifo &
tail -f myfifo | grep bar
tail -f myfifo | grep baz

不幸的是,这似乎不起作用。事实上,拖尾时我看到任何输出的唯一方法是当我第一次执行tail -f myfifothenfoo > mfifo时,但我不想重新启动 foo (这就是重点,否则我可以直接 grep standard out 并重新启动进程以 grep for不同的字符串)。有谁知道为什么会发生这种情况或对如何实现这一点有建议?

4

2 回答 2

4

发生这种情况是因为fifo 是一个数据流。一旦从 FIFO 中读取了一条数据,它就会从 FIFO 中移除。在您的情况下,foo存储在其中的输出myfifo正在由第一个读取tail -fgrepbar”的输出,而第二个则没有任何内容tail -f

但是您根本不需要将输出发送foo到文件(FIFO 或其他)。您可以直接将其输出发送tee并让它将输出发送到您想要的任意数量的进程。例如:

$ foo | tee >(grep -o bar) >(grep -o baz) >/dev/null

或者,如果您只是使用grep,则可以-e在输出中使用任意多次:

$ foo | grep -e bar -e baz
于 2013-04-18T20:41:15.423 回答
1

您可以使用不同的 grep 语法:

tail -f myfifo | grep -e 'pattern1' -e  'pattern2' -e 'pattern3'

我认为您希望两者在同一输出流上同时发生,对吗?

否则你可以玩 tee

tail -f myfifo | tee -a somefile | grep bar
grep foo somefile
于 2013-04-18T19:35:13.070 回答