如何将Unix中的'Top'命令输出保存为CSV文件?

3
我正在尝试通过shell脚本获取top命令的前5行,并需要将输出写入csv文件(我需要每15秒监视结果)。最后,我需要使用获取的数据表绘制图形。
我已经得到了一个shell脚本,可以将top命令的前5行写入txt文件:
#!/bin/bash
echo "execution started.."

top -b -n 3 | sed -n '7,1p' >> out.txt

while [ true ]; do
    sleep 15
    echo "running.."
    top -b -n 3 | sed -n '8, 12p' >> out.txt
done

这是几次执行后的out.txt文件内容:
    PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 3983 arun      20   0 1662480 309580  40936 S 26.3  6.4  13:36.00 gnome-shell
17907 arun      20   0  130020   1680   1172 R 10.5  0.0   0:00.03 top
 2016 root      20   0  221792  51172   9636 S  5.3  1.1   4:40.97 Xorg
11917 arun      20   0 7004884 570312  22040 S  5.3 11.7   0:48.83 java
    1 root      20   0   59732   7156   3992 S  0.0  0.1   0:02.71 systemd
 3983 arun      20   0 1662480 309580  40936 S 36.8  6.4  13:37.23 gnome-shell
 2016 root      20   0  221792  51172   9636 S 10.5  1.1   4:41.14 Xorg
 2720 mongod    20   0  624364  33716   5200 R  5.3  0.7   1:44.36 mongod
17918 arun      20   0  130020   1676   1172 R  5.3  0.0   0:00.02 top
    1 root      20   0   59732   7156   3992 S  0.0  0.1   0:02.71 systemd
 3983 arun      20   0 1662480 309580  40936 S 25.0  6.4  13:38.60 gnome-shell
 2720 mongod    20   0  624364  33672   5160 S  5.0  0.7   1:44.46 mongod
12081 arun      20   0 2687496 314248  21436 S  5.0  6.5   3:05.51 java
17922 arun      20   0  130020   1680   1172 R  5.0  0.0   0:00.02 top
    1 root      20   0   59732   7156   3992 S  0.0  0.1   0:02.71 systemd

但是我需要相同的数据以 csv 格式。我曾尝试通过将输出文件名设置为 out.csv 来实现!但是失败了(因为它不是正确的格式,整个数据都在第一个单元格中!)

请问您能否提供一种方法将相同的输出写入 csv 文件中?


while [ true ] 只是巧合地起作用。while [ false ] 也会做同样的事情。你可能指的是没有括号的 while true(这是 shell 内置命令 test 的同义词)。 - tripleee
1
我撤销了你最新的编辑,因为它与我的答案有特定关联。 - tripleee
https://dev59.com/5nM_5IYBdhLWcg3wzmgw#1221597 可以给您一些想法,如何使用 ps 以自定义格式转储CPU使用数据。 - Andre Holzner
1个回答

12

如果你想删除连续的空格并将它们替换成逗号,请尝试使用

top -b -n 3 | sed -n '8, 12{s/^ *//;s/ *$//;s/  */,/gp;};12q'

sed 脚本对第 8 行到第 12 行执行以下替换:

  • 将所有前导空格替换为空格(否则,PID 右对齐时会出现空的第一列)。
  • 将所有尾随空格替换为空格(类似地,以避免数据后面出现空字段)。
  • 将任何剩余的相邻空格替换为逗号。 打印此行。

最后,在第 12 行,我们完成了,因此退出 sed

Shell 不关心您重定向到的文件的名称,通常,在 Unix 上,文件扩展名是非正式的装饰,而不是像某些平台上的文件类型说明符。

您可以执行 echo hello >outputfile.ps,输出仍然是文本,而不是 PostScript(或许多其他可能解释的 .ps 文件扩展名)。 无论如何,echo 命令都不知道它被重定向了,因为这是在命令运行之前由 shell 处理的。 (好吧,echo 是一个 shell 内置的命令,因此理论上在这种情况下可能存在一些协调。)


谢谢@tripleee!您能详细说明一下您的解决方案吗?我不理解在{}中去除空格的代码!但仍然存在一些问题。我得到了这样的输出->,P,I,D,U,S,E,R,P,R,N,I,V,I,R,T,R,E,S,S,H,R,S,%,C,P,U,%,M,E,M,T,I,M,E,+,C,O,M,M,A‌​,N,D, ,3,9,8,3,s,u,d,h,i,r,2,0,0,1,6,7,6,2,6,0,3,1,9,4,4,8,4,1,6,1,6,S,5,2,.,4,6,.,6,1‌​,6,:,0,1,.,6,0,g,n,o,m,e,-,s,h,e,l,l, , - Arun Ramachandran
1
你似乎抄错了。在s/ */,/gp中,星号前有两个空格 - 我也会更新答案。 - tripleee
非常抱歉!那是我的错误。我已根据您的建议编辑了我的代码。得到了精确的输出!非常感谢! - Arun Ramachandran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接