将程序生成的文件重定向到另一个程序

将程序生成的文件重定向到另一个程序

在 Linux 环境中,我有一个程序会创建一个大文件 (2-3GB)。我需要过滤此文件 (例如,如果某行出现在前 10 行中,我想删除该行)。我想在程序运行时执行此操作,而不创建新文件。

如果程序将输出定向到 stdout 而不是文件,则可以通过管道 (prgram1 | filter_program > file) 轻松解决。但事实并非如此。

有办法吗?

答案1

先入先出

您可以让您的第一个程序写入 fifo(命名管道)而不是常规文件,然后您可以像在普通管道中一样处理输出:

mkfifo out
prgram1 -O out | filter_program < out  > file
rm out

例如,使用 wget as prgram1 您可以执行以下操作:

wget -qO out 'superuser.com' | grep '<title>' out

just|用于同时运行两个命令,管道本身不被使用。

程序必须按顺序写入文件才能正常工作。如果它需要在文件中移动,那就不行。


编辑:如果程序在写入之前删除了输出文件,则此方法不起作用。

那么我们需要更多的技巧。让程序如何?写入但不删除文件

$ prg1() { rm out; wget -qO out 'superuser.com'; }
$ mkfifo out
$ chmod 500 .
$ prg1 | grep '<title>' out

只要程序不是太挑剔并且删除失败时不会出错,那就应该可以工作。

相关内容