在 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
只要程序不是太挑剔并且删除失败时不会出错,那就应该可以工作。