如何将 Unix 'Top' 命令输出捕获到 CSV 文件?

Posted

技术标签:

【中文标题】如何将 Unix \'Top\' 命令输出捕获到 CSV 文件?【英文标题】:How To Capture Unix 'Top' Command Output to a CSV file?如何将 Unix 'Top' 命令输出捕获到 CSV 文件? 【发布时间】:2016-05-01 17:41:00 【问题描述】:

我正在尝试通过 shell 脚本获取top 命令的前 5 行,并且我需要将输出写入 csv 文件(我需要每 15 秒监控一次结果)。最后,我需要使用获得的数据表绘制图表。

我得到了将top 命令的前 5 行写入 txt 文件的 shell 脚本:

#!/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 来做到这一点!但这没有用。 (因为格式不正确,所以整个数据都在第一个 shell 中!)

您能否提供将相同输出写入 csv 文件的解决方案?

【问题讨论】:

while [ true ] 只是巧合地工作。 while [ false ] 会做同样的事情。您可能是指不带括号的while true(这是shell 内置命令test 的同义词)。 我回滚了您的最新编辑,因为它与我的回答特别相关。 ***.com/a/1221597/288875 可能会给您一些想法,如何使用ps 以自定义格式转储 CPU 使用数据 【参考方案1】:

如果您想修剪空格并用逗号替换它们,请尝试

top -b -n 3 | sed -n '8, 12s/^ *//;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, , 你似乎抄错了。 s/ */,/gp 中的星号前有两个空格 - 我也会更新答案。 真的很抱歉!这是我这边的一个错误。我已根据您的建议编辑了我的代码。得到准确的输出!非常感谢!

以上是关于如何将 Unix 'Top' 命令输出捕获到 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C 捕获另一个进程的输出?

将 top 的结果输出到文件中

如何将 UNIX 命令日期附加到 echo 语句

将 top 的结果输出到文件中

无法从 UNIX 上的命令文本输出文件中删除空格

在 PowerShell 中,如何将错误、警告、写入主机输出捕获到单个文件中?