Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何捕获Unix';顶部';命令输出到CSV文件?_Linux_File_Shell_Csv_Top Command - Fatal编程技术网

Linux 如何捕获Unix';顶部';命令输出到CSV文件?

Linux 如何捕获Unix';顶部';命令输出到CSV文件?,linux,file,shell,csv,top-command,Linux,File,Shell,Csv,Top Command,我正试图通过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

我正试图通过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!但那没用。(因为格式不正确,所以整个数据都在第一个shell中!)


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

如果要修剪空白并用逗号替换,请尝试

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,因此理论上在这种情况下可能会有一些协调。)

而[true]
只是碰巧起作用
而[false]
也会做同样的事情。你的意思可能是
而true
没有括号(括号是shell内置命令
test
的同义词)。我回滚了你最近的编辑,因为它与我的答案特别相关。可能会给你一些想法,如何使用
ps
以自定义格式转储CPU使用数据,谢谢@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,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,6,s,5,2,4,6,6,1‌​,你似乎把它转录错了。
s/*/,/gp
中的星号前面有两个空格,我也会更新答案。真的很抱歉!那是我这边的错误。我已经根据你的建议编辑了我的代码。得到了准确的输出!谢谢!