題 將程序生成的文件重定向到另一個程序


在linux環境中,我有一個程序可以創建一個大文件(2-3GB)。我需要過濾此文件(例如,如果它出現在前面的10行中,我想刪除一行)。我希望在程序運行時執行此操作,而無需創建新文件。

如果程序將輸出定向到stdout而不是文件,則可以通過管道(prgram1 | filter_program>文件)輕鬆解決。但這種情況並非如此。

有辦法嗎?


3
2017-10-13 07:21


起源




答案:


mkfifo

您可以讓您的第一個程序寫入fifo(命名管道)而不是常規文件,然後您可以像在普通管道中一樣處理輸出:

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

例如,使用wget作為prgram1,你可以這樣做:

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

| 只是用於同時運行兩個命令,管道本身不使用。

程序必須按順序寫入文件才能使用。如果它需要移動不會執行的文件。


編輯: 如果程序在寫入之前刪除輸出文件,則這不起作用。

那我們需要更多的詭計。如何讓程序 寫但不刪除文件 :

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

只要程序不是太繁瑣並且在刪除失敗時沒有錯誤,這應該可以工作。


2
2017-10-15 18:00



這似乎是一個很好的解決方案。但在我的情況下,program1在開始之前刪除先前的輸出文件然後 創建一個新的輸出文件 (這不是命名管道)。它不會將其輸出附加到現有文件。我可以將此常規輸出文件轉換為命名管道嗎? - ronstudy1
我嘗試的第一件事是阻止它刪除它。我剛剛編輯了我的答案。 - lemonsqueeze