長いコマンド出力の最後の10行(またはn)行のみを出力します。

長いコマンド出力の最後の10行(またはn)行のみを出力します。

数千行を出力するコマンドがあります。実際にコマンドの進行状況を確認するには、この行が必要です。ただし、最新の10行以上を表示する必要はありません。

どうすればいいですか?

pipeとを使ってみましたtail。しかし、それはうまくいきませんでした。元のコマンドが完了した後、最後の10行を取得しました。

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 トップ ; 一番下 アル字型

これはデモです

# 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はすべてのシェルコマンドを処理し、それらをすべて1つのスクリプトに入れることができます。たとえば、コマンド引数を使用して、文字列またはVery important information. MUST BE VISIBLE!機密情報を含むファイル名を渡すことができます。スクロールウィンドウを作成する前に表示します。

もっと深いバージョンを作りました。ペーストビン、これはいくつかのコマンドオプション(スクロールウィンドウのサイズ、ウィンドウをオフセットする端末の行数、出力前に表示される「ヘッダファイル」など)を処理します。コマンドオプションの詳細といくつかの追加の説明があります。

はい

上記のコードをそのまま使用し、というファイルに入れたらscroller.pl実行できるようにファイル権限を設定すればいいです。

$ chmod +x scroller.pl

その後、次のように長期実行コマンドの出力を表示できます。

$ seq 10000 | scroller.pl

                       Scroller.pl ss

パイプされた出力がscroller.pl完了すると、このバージョンは終了し、通常のシェル設定に戻ります。

答え4

rpm -qaこれは、手動で定義されたスリープタイマーを使用してコマンド(この場合)の出力を1行ずつ監視するために使用できる単純な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


関連情報