在列中显示终端输出以有效地查看更多输出

Posted

技术标签:

【中文标题】在列中显示终端输出以有效地查看更多输出【英文标题】:Displaying terminal output in columns for efficiently viewing more output 【发布时间】:2013-05-20 21:36:31 【问题描述】:

假设我有大量的日志输出或者我想要密切关注的东西,以便能够同时查看尽可能多的输出。

我有很多屏幕空间,为了更好地利用它,我希望能够设置一个特殊的缓冲区,垂直包裹终端输出,这样看起来像列布局(如在书籍或网页中)。

这样我可以例如将整个宽屏显示器专用于三列输出,它们可以同时显示来自同一流的正常输出量的三倍。我认为这是 tmux 可以很好地支持的东西,尽管由于移动文本的分裂性质,它可能会稍微增加网络流量的负载。

最好的情况是 tmux 已经通过某个选项支持此功能,但如果不支持,也许可以编写脚本!是否可以以编程方式“检索”特定窗格的 tmux 历史缓冲区的内容?我反对需要在每个传入的输出行上调用tmux 的脚本,但对于缓慢的输出日志来说仍然值得。

也许这甚至不需要 tmux,也许这是在寻呼程序的功能空间内。 Vim 可能无法处理它,因为我需要它来支持 ANSI 颜色代码显示(Vim 不能很好地显示)。

这里的动机是更好地利用水平空间。在某种程度上,它是将寻呼程序的功能扩展到第二维。如果我可以简单地购买更多显示器,以便能够同时查看更多数据,而无需操纵我的软件来显示我数据的不同部分,那么我可以通过减少我一直做的所有滚动来更有效地工作。

来回查看>>设置窗格并滚动两个缓冲区以便来回查看>>在单个缓冲区中来回滚动

无操作>>开始操作一次>>每次迭代操作

更多思考: 我只是想到了一个巧妙的想法来快速和肮脏地构建这个功能,如果我能想出一种方法来设置一个寻呼机(或者甚至只是cat,真的)来显示最后一页(这是一个对输出不做任何事情的小例子),显示倒数第二页,显示倒数第三页等。这些可以在一组 tmux 窗格中组合在一起。那么,当一个新行出现时,所有这些视图都会向上滚动,我们会产生一种错觉,即它们都是单个缓冲区的连续显示,即使它不是。所以这将是一个基于 tmux 的 hack,谢天谢地,它不需要对每个新行进行某种 tmux 调用...... tmux 让我们可以查询窗格的高度,以便我们可以确定在每个缓冲区中显示哪个“部分”。如果可以使缓冲区同步滚动浏览它们的历史,那么整个“列”集也可以滚动。

【问题讨论】:

【参考方案1】:

如果您正在查看三个文件,则上述方法可以正常工作,但听起来您正在查看一个文件。我写了一些应该做正确事情的python(作为tail的替代品)。

#!/usr/bin/python

import time, os, sys

fname = sys.argv[1]
lines_per_page = 50
if len(sys.argv) > 2:
    page_from = int(sys.argv[2])
    pages_per_page = int(sys.argv[3])
else:
    page_from = 0
f = open(fname)
f.seek(os.stat(fname).st_size)

b = []

while 1:
    where = f.tell()
    line = f.readline()
    if not line:
        time.sleep(1)
        f.seek(where)
    else:
        # keep a buffer
        if page_from > 0:
            b.append(line)
            front = lines_per_page * page_from
            if len(b) > front:
                print b[-front],
        else:
            print line,

您可以将其调用为 tail.py file 0 num_of_rows_in_your_term,然后为每个其他垂直窗格增加 1。

【讨论】:

【参考方案2】:

前几天(大约 2 个月前)我遇到了this gem。我的 vimrc 包含这个魔法:

:noremap <silent> <Leader>c :<C-u>let @z=&so<CR>:set so=0 noscb<CR>:bo vs<CR>Ljzt:setl scb<CR><C-w>p:setl scb<CR>:let &so=@z<CR>

非常非常酷,而且非常强大,因为它是 Vim。唯一的缺点是 Vim 不能真正有效地用于查看实际的原始终端输出(可能包括 ANSI 颜色代码,这是 Vim 在处理时特别糟糕的东西),但对于大多数目的,查看(和编辑)非常大型源文件等,这很好用。

编辑:我注意到这实际上并没有真正回答我的问题,这基本上是如何更好地用许多列值终端输出(例如,来自脚本或编译或日志的输出)填充我的屏幕,这些 vim 缓冲的东西不是很擅长。

虽然它有一些潜力,但任何日志都可以通过管道传输到文件中,然后 Vim 可以编写脚本以不断刷新并将其加载到多列缓冲区中。

【讨论】:

以上是关于在列中显示终端输出以有效地查看更多输出的主要内容,如果未能解决你的问题,请参考以下文章

如何在列中显示饼图的图例?

在终端窗口上显示大输出

linux进程

怎样查看Tomcat动态控制台信息

如何查看Ubuntu终端之前显示的内容?

从子进程读取的实时标准输出仅在从 PyCharm 而不是终端运行时才有效