我有一个命名的 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