将连续流传送到 grep 作为在文件中搜索的搜索词

将连续流传送到 grep 作为在文件中搜索的搜索词

我有一个命名的 fifo,我正在向该 fifo 写入随机数。当我写入 fifo 时,我想在numbers.txt文件中查找写入的文本并将结果行写入标准输出。

文件内容numbers.txt为:

1 one
2 two
3 three
... and so on

我想搜索通过管道传输到grep该文件中的文本。例如,如果我写入1命名管道,grep 应该打印1 one到标准输出。

我正在第一个终端中运行如下所示的命令:

cat <> myfifo | grep -f - numbers.txt

我正在另一个终端中向 fifo 写入数据,如下所示:

echo 1 > myfifo

但我在第一个终端窗口的 stdout 中看不到任何输出。

当我在第二个终端窗口中2 two执行时,我想在第一个终端输出中看到。echo 2 > myfifo如何实现这一目标?

答案1

cat <> myfifo打开命名管道以进行读取和写入。只要管道打开用于写入,读取器就不会到达文件末尾。因此cat永远不会到达其输入的末尾,因此它永远不会关闭其输出(即到 的管道)grep,因此grep永远不会到达该选项的输入的末尾-f

Grep 在知道要搜索的模式之前无法开始搜索。因此它永远处于阻塞状态,甚至没有开始读取numbers.txt

如果你想搜索出现的模式,myfifo那么只需使用

grep -f myfifo numbers.txt

你也可以写它,cat <myfifo | grep -f - numbers.txt但这没有必要的复杂。

请注意,模式 like1匹配任何包含 的行1,例如11 eleven。如果您只想匹配以通过管道的数字之一开头的行,请使用类似

<myfifo sed 's/^0*/^0*/; s/$/ /' | grep -f - numbers.txt

答案2

我不知道为什么你的代码不起作用,我想这与<>接收重定向有关cat,并且它没有响应文本结束标志,因此没有任何内容可以到达grep.再说一遍,我猜测。更有知识的人可能会解释这一点。

无论如何,下面的事情就可以了。

写入终端:

$ printf "%s\n" {1..7} > myfifo

或者:

$ cat > myfifo
1
2
3
4

接收终端:

$ grep -f myfifo numbers.txt 
1 one
2 two
3 three
4 four
5 five
6 six
7 seven

或这个:

cat myfifo | grep -f - numbers.txt

相关内容