Linux 輸出重定向不適用於 awk

Linux 輸出重定向不適用於 awk

我正在嘗試根據頂部的一些輸出編寫一個漂亮的 csv 檔案。我用 awk 重新格式化輸出,如下圖:

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }'

效果很好。現在我想將輸出保存到文件中。我認為使用> output.log應該有效:

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }' > output.log

然而,當我按 Ctrl-C 退出頂級進程時,這只會導致一個空檔。我究竟做錯了什麼?

答案1

Unix 的標準 I/O(“stdio”)庫可偵測它正在寫入哪種類型的東西(資料接收器)。如果它偵測到終端(即視窗),它會在程式請求時立即寫入資料。然而,當寫入檔案時,I/O 函式庫會緩衝資料並一次將其寫入 512(或更多)位元組的區塊中。當然,當呼叫程式退出時,如果它乾淨地退出,它會刷新緩衝區(寫出部分區塊)。異常終止(由Ctrl+引起C)可能會導致輸出檔案不完整。

要修復,請嘗試:

top -b | ( trap "" 2; nawk '(你的nawk命令)' > output.log)`

trap命令將使該nawk命令不受Ctrl+ 的影響C。 (當然,Ctrl+C仍然會終止top進程,並且nawk當它在管道上到達檔案結尾(EOF)時將(乾淨地!)終止。

PS 這假設(要求)您正在運行bashbash相容的 shell。

答案2

頂部繼續運行。您希望運行它的次數有限。使用 -n 選項。像這樣:

top -b -n 1 | awk '{ ... }'

或者,當您願意時,可以使用 C-\ 退出 top。使用 Cc 會中止它並過早破壞管道(在 awk 獲取任何內容之前)。

$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo

相關內容