仅输出冗长命令输出的最近 10(或 n)行

仅输出冗长命令输出的最近 10(或 n)行

我有一个可以输出数千行的命令。我实际上需要这些行才能查看命令的进度。但我不需要查看超过 10 条最近的行。

我怎样才能做到这一点?

我已经尝试过使用pipeand 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 的 ss

当通过管道输入的输出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


相关内容