수천 줄을 출력하는 명령이 있습니다. 실제로 명령의 진행 상황을 보려면 이 줄이 필요합니다. 하지만 가장 최근 행 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에서 모든 쉘 명령을 처리하고 이를 모두 하나의 스크립트에 넣을 수 있습니다. 또는 예를 들어 명령 인수를 사용하여 문자열 Very important information. MUST BE VISIBLE!
이나 중요한 정보가 포함된 파일 이름을 전달할 수 있습니다. 스크롤 창을 생성하기 전에 표시합니다.
좀 더 심도 있는 버전을 만들어 봤습니다페이스트빈, 이는 일부 명령 옵션(예: 스크롤 창 크기, 창을 오프셋할 터미널의 줄 수, 출력 전에 표시되는 "헤더 파일")을 처리합니다. 명령 옵션에 대한 세부 정보와 몇 가지 추가 설명이 제공됩니다.
예
위의 코드를 그대로 사용하고, 이라는 파일에 넣으면 scroller.pl
실행 가능하도록 파일 권한을 설정하면 됩니다.
$ chmod +x scroller.pl
그런 다음 이를 사용하여 다음과 같이 장기 실행 명령의 출력을 표시할 수 있습니다.
$ seq 10000 | scroller.pl
파이프된 출력이 scroller.pl
완료되면 이 버전이 종료되고 일반 셸 설정으로 돌아갑니다.
답변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