![Linux 輸出重定向不適用於 awk](https://rvso.com/image/1337795/Linux%20%E8%BC%B8%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91%E4%B8%8D%E9%81%A9%E7%94%A8%E6%96%BC%20awk.png)
我正在嘗試根據頂部的一些輸出編寫一個漂亮的 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 這假設(要求)您正在運行bash
或bash
相容的 shell。
答案2
頂部繼續運行。您希望運行它的次數有限。使用 -n 選項。像這樣:
top -b -n 1 | awk '{ ... }'
或者,當您願意時,可以使用 C-\ 退出 top。使用 Cc 會中止它並過早破壞管道(在 awk 獲取任何內容之前)。
$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo