![仅输出冗长命令输出的最近 10(或 n)行](https://linux22.com/image/45878/%E4%BB%85%E8%BE%93%E5%87%BA%E5%86%97%E9%95%BF%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA%E7%9A%84%E6%9C%80%E8%BF%91%2010%EF%BC%88%E6%88%96%20n%EF%BC%89%E8%A1%8C.png)
我有一个可以输出数千行的命令。我实际上需要这些行才能查看命令的进度。但我不需要查看超过 10 条最近的行。
我怎样才能做到这一点?
我已经尝试过使用pipe
and tail
。但这没有用。原始命令完成后我刚刚得到最后十行:
whatever command that has too much output | tail -f
重要的是控制台不会被清除或类似的事情,因为在带有冗长输出的命令之前会打印一些重要信息。
一个例子:
echo "Very important information. MUST BE VISIBLE!"
# This gives me about 10,000 lines of output pretty fast!
# This output should be shrinked down to the most recent 10
tar -cvf "Bckup.tar" "folder to backup/"
# More code
我希望这能解决问题。
编辑:
问题multitail
是它占据了整个屏幕。因此,如果我有多个输出(我有。在此之前运行多个包含重要信息的命令。并且我需要多次使用它)。
像在只显示 10 行的屏幕上运行这样的东西将是完美的。 (我知道这行不通)。
您可以想象其他命令有一些输出。然后我调用带有冗长输出的命令。此输出保留在只能显示 10 行之类的屏幕中。命令完成后,更多输出将发送到控制台,这应该像正常输出一样位于它的正下方。
Output
Important Information
Other commands output
----------------------------------------
some lines for the tar command
----------------------------------------
More output
....
....
(只是没有线条)
答案1
ECMA-48 (vt100-ish) 终端有一个转义序列,可限制滚动到行的子集:
CSI 顶部 ; 底部 r
这是一个演示
# Start with the screen clean and cursor on line 1
clear
# print the non-scrolling banner line
echo Hello world
# set up the scrolling region to lines 2 through 11 and position the
# cursor at line 2
echo -n '^[[2;11r^[[2H'
# Run a command that will produce more than 10 lines, with a slight delay
# so it doesn't happen so fast you can't see it scrolling
perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'
# Restore normal scrolling and put cursor on line 12
echo -n '^[[r^[[12H'
^[
注意:上面的所有实例都必须是脚本中的实际转义字符。例如,在 vi 中,它们以插入模式输入,CtrlV后跟Esc。
答案2
多尾是一种tail -f
类固醇。它的功能包括分割屏幕和显示多个文件或命令。
如果重要的行来自文件:
tar -cvf "Bckup.tar" "folder to backup/" | multitail important.txt -j
如果重要的行是命令的输出:
tar -cvf "Bckup.tar" "folder to backup/" | multitail -l 'show-stuff --important' -j
答案3
如果我理解正确的话,BrainStone 正在要求一个“滚动窗口”。
您可以使用 Curses 和 perl 来实现这一点:
#! /usr/bin/perl
use strict;
use warnings;
use Curses;
$SIG{INT} = sub { endwin; exit(0); };
initscr();
my $w = newwin(11, COLS(), 10, 1);
$w->scrollok(1);
my $a=0;
while(<>) {
$a++ if($a < 10);
$w->addstr($a, 0, $_);
$w->refresh();
}
endwin;
这将在第 10 行创建一个 10 行长的“滚动窗口”,它将显示管道命令的输出。您必须更改它以满足您的需要,但基本前提是存在的。您可能希望在 perl 中处理所有 shell 命令,并将其全部放在一个脚本中。或者,例如,您可以使用命令参数来传递字符串Very important information. MUST BE VISIBLE!
,或者可以是包含重要信息的文件名。并在创建滚动窗口之前显示它。
我已经做了一个更深入的版本帕斯特宾,它处理一些命令选项(例如滚动窗口的大小、终端中偏移窗口的行数以及在输出之前显示的“头文件”)。提供了命令选项的详细信息和一些附加注释。
例子
按原样使用上面的代码,如果将其放入名为 的文件中scroller.pl
,只需设置文件权限,使其可执行:
$ chmod +x scroller.pl
然后,您可以使用它来显示长时间运行的命令的输出,如下所示:
$ seq 10000 | scroller.pl
当通过管道输入的输出scroller.pl
完成时,该版本将退出,并返回到正常的 shell 设置。
答案4
rpm -qa
这是一个简单的 bash 脚本,您可以使用它通过手动定义的睡眠计时器逐行监视命令的输出(本例中的命令是)。它还会将您的输出附加到临时文件,以供脚本完成后参考。至于循环通过 10 行缓冲区,我目前无法想到解决方案。
#!/bin/bash
syntax="rpm -qa"
command=( $($syntax) )
echo "Using: $syntax"
for line in "${command[@]}"
do
echo "$line" >> /tmp/temp.file
echo -ne "OUTPUT: $line\033[0K\r"
sleep 0.2
done
echo