Linux 输出重定向不适用于 awk

Linux 输出重定向不适用于 awk

我正在尝试根据 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 这假定(要求)您正在运行bashbash兼容的shell。

答案2

Top 持续运行。您想运行有限的次数。使用 -n 选项。如下所示:

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

或者,当您想要退出 top 时,可以使用 C-\ 退出。使用 Cc 将中止它并过早地中断管道(在 awk 得到任何东西之前)。

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

相关内容