2015-11-05 65 views
1

我想將程序的輸出分割成更小的文件。這是一個長期運行的程序,它將輸出打印到stderr,我想用一系列較小的文件而不是一個巨大的文件捕獲日誌。所以,我有什麼是:流式分割

program 2>&1 | split -l100 & 

......但令我非常沮喪,我發現了split工具實際上並沒有寫任何文件到磁盤,直到輸入緩衝區結束。我想要的是一個流媒體工具,可以自動將輸入以流方式複製到輸出文件,而不必等到源流結束,這在我的情況中是不必要的。我也嘗試使用split工具的-u選項,但它似乎不起作用,除非您選擇-n選項,但該選項並不適用於我的情況,因爲生成的文件數量可能會任意高。有沒有可以讓我這樣做的Unix工具?

+1

嘗試使用'awk'。它可以每100行打開一個新的輸出文件。 – Barmar

+0

爲什麼不能'program 2>&1 | split -l100 - output_&' –

+0

@Barmar我嘗試了這裏的方法http://stackoverflow.com/questions/25712730/split-file-by-number-of-lines-and-pattern-in-awk-perl,但它沒有我想要的流式效果。它似乎仍然只是在輸入流結束後將更改提交到磁盤。 –

回答

0

Barmar建議在awk腳本的每次迭代之後爲我添加一個調用fflush()。這對我來說比較好,因爲在完成每個文件時調用close(),因爲只有在每個文件已滿時纔會刷新,而我想要一個行緩衝行爲。我還必須將輸出管道配置爲行緩衝,因此最終的命令如下所示:

stdbuf -oL -eL command 2>&1 | awk -v number=1 '++i>1000 {++number; i=0} {print > "file" number; fflush("file" number)}'