0

I'm trying to write a nice csv-file based on some output from top. I reformat the output with awk like this:

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

That works perfectly. Now I want to save the output to a file. I would think that using > output.log should work:

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

However, this simply results in an empty file when I Ctrl-C out of the top-process. What am I doing wrong?

2 Answers 2

1

Unix’s standard I/O (“stdio”) library detects what kind of thing (data sink) it is writing to.  If it detects a terminal (i.e., a window), it writes data immediately when the program requests it.  When writing to a file, however, the I/O library buffers data and writes it in blocks of 512 (or more) bytes at a time.  Of course it flushes the buffer (writing out a partial block) when the calling program exits — if it exits cleanly.  An abnormal termination (as caused by Ctrl+C) can leave you with an incomplete output file.

To fix, try:

top -b | ( trap "" 2; nawk '(your nawk command)' > output.log)`

The trap command will make the nawk command immune to the Ctrl+C.  (Of course the Ctrl+C will still kill the top process, and nawk will terminate (cleanly!) when it gets an end of file (EOF) on the pipe.

P.S. This assumes (requires) that you are running bash or a bash-compatible shell.

0

Top keeps running. You want to run it a limited amount of times. Use the -n option. like so:

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

Alternatively, you can quit top when you feel like doing so with C-\. Using C-c will abort it and break the pipe prematurely (before awk gets anything).

$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo
2
  • First of all, I believe that you mean Ctrl-\, not Ctrl-/. Secondly, does that really change anything? By not piping top’s output through awk, you are getting more output more quickly. Do you really end up getting 352½ lines, with the 353rd cut off in the middle, at a file size that is a multiple of 512? Nov 8, 2012 at 18:17
  • You get the last "good" line and all lines before that. No half lines (usually - but that depends on how nawk is treating output and input ). Actually, I think I misunderstood your question. The problem is probably that nawk doesn't write anything when top is interrupted like that. It works as you expect it to here though. It may be relevant to include your versions of tbeing hephe shell, nawk and OS. Sorry I could not help. Nov 8, 2012 at 18:35

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .