我正在尝试根据 top 的一些输出编写一个漂亮的 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 退出 top-process 时,这只会导致文件为空。我做错了什么?
答案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
Top 持续运行。您想运行有限的次数。使用 -n 选项。如下所示:
top -b -n 1 | awk '{ ... }'
或者,当您想要退出 top 时,可以使用 C-\ 退出。使用 Cc 将中止它并过早地中断管道(在 awk 得到任何东西之前)。
$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo