如何将文本文件输出重定向到管道?

时间:2016-02-09 01:35:57

标签: linux shell unix pipe

我正在运行一个带有选项.t1,.t2{ tr > td { color: red; } } 的Unix工具。我想将它重定向到一个管道,如下所示:

-l log_file

不幸的是,当我指定my_tool -l /dev/tty | grep "Aye, Caramba!" 时,/dev/tty的输出会直接转到控制台窗口,绕过my_tool

我也试过grep,但没有用。

因此问题是:我需要为上面的选项/dev/stdout指定什么才能将相应的输出捕获到管道中?

4 个答案:

答案 0 :(得分:2)

您可以尝试使用named pipe

mkfifo pipe
grep "Aye, Caramba!" pipe &
my_tool -l pipe

在这个例子中,grep将打开pipe进行读取,这将阻塞,直到另一个进程打开它进行写入。当my_tool将数据写入管道时,grep将能够读取数据。一旦my_tool关闭pipe,grep将获得文件结束指示并退出。

答案 1 :(得分:2)

您可以使用process substitution创建一个文件句柄,用于管理通过命令管道写入句柄的任何内容。

例如,这应该有效:

my_tool -l >(grep "Aye, Caramba!" > path/to/store/partial.log)

这会将my_tool /dev/fd/XXX路径传递给它。写入该路径的任何内容都通过grep传送,然后写入partial.log文件。

在功能上,这类似于Kenster关于使用命名管道的建议,但在我看来,流程替换通常更容易使用和推理。

答案 2 :(得分:0)

运行生成日志的一个进程可能很有用,而另一个进程在创建日志并使用grepping其输出之后

为此,在一个控制台中,您可以运行my_tool,生成所需的日志。

no matching function for call to 'std::vector<projectile>::push_back(sf::Vector2<float>, sf::Vector2<float>)'|

然后在另一个控制台中运行:

my_tool -l /tmp/mylog

tail -f -n+0 /tmp/mylog | grep --line-buffered the_pattern_to_match 将打印作为参数传递的文件的“最后”行。 tail告诉tail处理完整文件,直到它写入的位置。 -n+0告诉tail保持文件打开并继续发送到达标准输出的任何内容(在这种情况下重定向到管道)。

然后在grep中你会想要-f所以它不会在打印自己的输出之前等待尾部完成。

我希望这会有所帮助。

答案 3 :(得分:0)

尝试my_tool -l /dev/stdout | grep

同样如Zach建议的那样,命令本身可能支持其他一些选项。