将htop的输出转换为易读的文件

35

我尝试将 htop 管道导出到文本文件 (e.g. htop > text.txt),但输出的文本包含格式化字符串造成乱码(如下图所示)。有没有方法可以获得更漂亮、易读的输出结果呢?

^[7^[[?47h^[[1;30r^[[m^[[4l^[[?1h^[=^[[m^[[?1000h^[[m^[[m^[[H^[[2J^[[1B  ^[[36m1  ^[[m^[[1m[^[[m^[[32m||||||||||^[[31m||||||||||^[[30m^[[1m                                                            \
     22.2%^[[m]^[[m     ^[[36mTasks: ^[[1m159^[[m^[[36m total, ^[[32m^[[1m5^[[m^[[36m running^[[3;3H2  ^[[m^[[1m[^[[30m                                                                                \
      0.0%^[[m]^[[m     ^[[36mLoad average: ^[[30m^[[1m1.11 ^[[m^[[m1.28 ^[[1m1.31 ^[[4;3H^[[m^[[36m3  ^[[m^[[1m[^[[m^[[32m||||||||||^[[30m^[[1m                                                       \
                    11.1%^[[m]^[[m     ^[[36mUptime: ^[[1m9 days, 22:04:51^[[5;3H^[[m^[[36m4  ^[[m^[[1m[^[[30m                                                                                      0.0\
%^[[m]^[[6;3H^[[m^[[36m5  ^[[m^[[1m[^[[m^[[31m||||||||||^[[30m^[[1m                                                                           11.1%^[[m]^[[7;3H^[[m^[[36m6  ^[[m^[[1m[^[[30m           \
8个回答

71

htop的作者在这里。

不,没有"好"的方法将htop的输出导入到文件中。它是一个交互式应用程序,并使用终端重绘例程生成其界面(因此,将其进行管道处理与将vim管道处理到文本文件中相同--您将获得类似的结果)。

要以文本格式获取有关进程的信息,请使用"ps"。例如,ps auxf > file.txt会给你大量易于解析的信息(或者如果您不希望树状格式,则使用ps aux --请参见man ps以获取更多选项)。


5
谢谢您的回复。我特别想找到每个处理器的使用情况,htop可以很好地做到这一点。是否有一种通过ps来访问它的方法? - DilithiumMatrix
6
谢谢,但是请将此导出为文件以便更方便使用。 - themhz
2
+1 嗨,希沙姆,htop没有-b开关 :) ,我想这样使用它以获得无菜单行的输出:htop -b | aha --black - Gerrit Griebel
htop 显示了在内核中大约花费的 CPU 核心百分比(例如红色)。这是 ps 无法提供的。因此,如果能将 htop 转储到文件中就太好了。 - HCSF

28

htop输出ANSI转义码以使用颜色并在终端中移动光标。有一个很棒的命令行程序aha,可用于将ANSI转换为HTML。

Ubuntu/Debian安装

apt-get install aha

将htop输出保存为HTML文件

echo q | htop | aha --black --line-fix > htop.html

有关使用 ansi2html.sh 的示例,请参见 https://news.ycombinator.com/item?id=10323333,链接中提出了一个功能请求,即添加一个 -b 选项到 htop 中,以使批处理更简单。 - pixelbeat
为什么需要在开头使用 echo q?尝试过没有使用它,结果在文件末尾得到了额外的文本。更新:是为了退出 htop 对吗? - Zain Qazi
如果你想让 htop 显示为特定终端大小运行,你可以像这样做:LINES=32 COLUMNS=80 htop - undefined

17

我曾经有同样的需求,最终使用top代替htop,因为它可以通过-b标志提供批处理模式。

-b : 批处理模式操作 在“批处理模式”下启动 top 可以将输出从 top 发送到其他程序或文件中,这可能很有用。在此模式下,top 不会接受输入并一直运行,直至您使用“-n”命令行选项设置的迭代限制或被终止为止。

例如:

top -b -n 1

希望这能帮到你,即使它没有使用 htop


8

这个命令输出纯文本。(需要安装ahahtml2text。)

echo q | htop -C | aha --line-fix | html2text -width 999 | 
grep -v "F1Help\|xml version=" > file.txt

这与 https://dev59.com/UmMm5IYBdhLWcg3wivf7#30224271 有何不同? - DilithiumMatrix
@DilithiumMatrix 这将为您提供干净的文本结果,没有任何HTML标签。 - k0fe
@DilithiumMatrix 忘记添加输出命令了。我已经进行了编辑。你试试了吗?这是你需要的吗? :) - k0fe

1

首先安装recode,然后将其编码为utf-8:

$htop | recode utf-8 > test.txt

然后将文件连接起来,你就可以了。

1
可能作为一种解决方法还不错,但是当我尝试过之后,它未能获取到所有的进程列表,并且总是只显示了一个子集,这并不是一个可靠获取信息的方式。 - fduff

1

在运行htop之前,您还可以使用脚本以一种模式将时间重定向到文件中,以便以后播放。这是“另一个解决方法”和“展示和演示”的领域。

script -t -a /var/tmp/script.htop.out 2> /var/tmp/script.htop.out.timings
htop 

然后播放

scriptreplay /var/tmp/script.htop.out.timings /var/tmp/script.htop.out

0

根据之前的回答,我建议使用Python进行一些后处理。代码如下:

首先,我们从htop获取文本:

echo q | htop -C > a.txt

然后,我们使用Python使其易于阅读:

import re
htop = open("a.txt").read()
print(re.sub(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])', "", re.sub(r"\x1b\[\d\d;\dH|\x1b\[\d;3H", "\n", '\n'.join(htop)))[9:])

结果如下:

1  [                          0.0%]   Tasks: 11, 38 thr; 1 running
2  [                          0.0%]   Load average: 0.38 0.26 0.11 
3  [                          0.0%]   Uptime: 01:19:50
4  [                          0.0%]
Mem[|#****              700M/25.5G]
Swp[                         0K/0K]
    PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command        
     51 root       20   0  359M 62880 33428 S  0.0  0.2  0:00.00 /tools/node/bin
52 root20   0  359M 62880 33428 S  0.0  0.2  0:00.21 /tools/node/bin
53 root20   0  359M 62880 33428 S  0.0  0.2  0:00.19 /tools/node/bin
54 root20   0  359M 62880 33428 S  0.0  0.2  0:00.16 /tools/node/bin
55 root20   0  359M 62880 33428 S  0.0  0.2  0:00.15 /tools/node/bin
56 root20   0  359M 62880 33428 S  0.0  0.2  0:00.00 /tools/node/bin
57 root20   0  359M 62880 33428 S  0.0  0.2  0:00.05 /tools/node/bin
58 root20   0  359M 62880 33428 S  0.0  0.2  0:00.04 /tools/node/bin
59 root20   0  359M 62880 33428 S  0.0  0.2  0:00.05 /tools/node/bin
60 root20   0  359M 62880 33428 S  0.0  0.2  0:00.04 /tools/node/bin
1 root20   0  359M 62880 33428 S  0.0  0.2  0:08.76 /tools/node/bin
16 root20   0 35892  4768  3660 S  0.0  0.0  0:00.62 tail -n +0 -F /
75 root20   0  190M 61096 13512 S  0.0  0.2  0:00.00 /usr/bin/python
76 root20   0  190M 61096 13512 S  0.0  0.2  0:00.56 /usr/bin/python
F1Help  F2Setup F3SearchF4FilterF5Tree  F6SortByF7Nice -F8Nice +F9Kill  F10Quit

-1

这可能听起来很新手,但是如果您有多个显示器,您可以在“录制我的桌面”捕获该区域时运行htop。 它更像一个视频,可能无法帮助搜索和排序,但它会看起来漂亮。


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