![명령 출력의 마지막 n 줄을 표시합니다.](https://linux55.com/image/176912/%EB%AA%85%EB%A0%B9%20%EC%B6%9C%EB%A0%A5%EC%9D%98%20%EB%A7%88%EC%A7%80%EB%A7%89%20n%20%EC%A4%84%EC%9D%84%20%ED%91%9C%EC%8B%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
docker build
명령을 실행하려고 합니다 . 출력의 마지막 "n"줄만 연속적으로 보고 싶습니다. 예를 들어 일반적인 docker build 명령은 다음과 같은 내용을 제공합니다.
Building myimage
Step 1/15 : FROM python:3.6.9
---> 5bf410ee7bb2
Step 2/15 : WORKDIR /
---> Running in 201dd686c5d9
Removing intermediate container 201dd686c5d9
---> 298d3c728059
Step 3/15 : COPY . .
---> a47754a932c3
Step 4/15 : RUN chmod 755 /launch/start-script.sh
---> Running in ef27984abecf
Removing intermediate container ef27984abecf
---> ae13426f44e9
Step 5/15 : RUN pip install --upgrade pip
...
...
...
원하는 출력 n=3
은
Removing intermediate container ef27984abecf
---> ae13426f44e9
Step 5/15 : RUN pip install --upgrade pip
꼬리까지 파이프로 하려고 했는데,
docker build | tail -3
그러나 빌드가 완료되면 마지막 3줄이 표시됩니다. 프로세스가 실행되는 동안 마지막 "n"줄을 계속 표시할 수 있습니까?
답변1
#!/bin/sh
i=0
[ "$#" = 1 ] || { >&2 echo "The number of lines should be provided"; exit 9; }
nlines=$1
while IFS= read -r line; do
clear
all="$all
$line"
i=$((i+1))
if [ "$i" -ge "$nlines" ]; then
all="${all#*
}"
fi
printf '%s\n' "$all"
done
실행 가능하게 만들고( chmod +x nlines.sh
) 3줄을 연속으로 인쇄합니다.
docker build | ./nlines.sh 3
clear
화면을 지웁니다. 이는 행이 표준 입력에서 나올 때마다 수행됩니다.그러면 새로 읽은 행이 변수에 추가됩니다
all
.
all="$all
$line"
[ "$i" -ge "$nlines" ]
표시할 최대 행 수에 도달했는지 테스트합니다. 의 경우,- 그러면 변수에서 가장 오래된 행이 제거됩니다.
all="${all#*
}"
답변2
저는 다음과 같은 프로그램 출력을 보기 위한 유틸리티를 개발했습니다.pw
(튜브미터).
기본 요점은 허용되는 답변의 쉘 스크립트와 크게 다르지 않습니다. 프로그램은 표준 입력의 모든 것을 지속적으로 읽고 커서 위치(ANSI 시퀀스)를 변경하고 선을 다시 그려 디스플레이를 업데이트합니다.
pw
라인은 해당 모드에 따라 몇 가지 다른 규칙에 따라 샘플링되는 작은 FIFO 버퍼를 통해 펌핑됩니다. 통과하는 모든 데이터를 유지하지 않기 때문에 프로그램은 작고 고정된 양의 메모리로 작동합니다.
pw
POSIX 작업 제어와 통합됩니다. 백그라운드에 놓고 실행(또는 백그라운드에서 작업 시작)을 지시하면 여전히 입력을 읽지만 터미널 디스플레이를 업데이트하지 않습니다(그렇게 하면 신호가 생성됩니다 SIGTTOU
). 백그라운드 작업에서는 트리거가 계속 실행되고 FIFO의 스냅샷이 생성됩니다. 이를 전경으로 가져오면 표시 내용이 다시 그려집니다. 따라서 셸 세션 내에서는 모니터링할 수 있는 많은 작업이 동시에 진행될 수 있습니다 pw
. 뒤에서는 무언가가 출력을 읽고 있기 때문에 차단하지 않습니다.
pw
FIFO에 도달하기 전에 입력을 필터링하기 위해 즉시 편집할 수 있는 다양한 grep 패턴을 제공합니다.
표시할 FIFO의 스냅샷을 캡처하도록 트리거를 설정할 수 있습니다. 19개의 깊은 스냅샷 기록이 있습니다. 트리거는 FIFO의 특정 행과 일치하는 패턴으로 구성됩니다. 트리거를 사용하여 반복 패턴을 고정하는 경우 오실로스코프의 트리거가 주기적인 파형을 고정된 것처럼 보이게 만드는 것과 마찬가지로 트리거는 디스플레이를 "정지"된 것처럼 보이게 할 수 있습니다.
보기는 크기와 위치가 다른 두 개 또는 세 개의 수직 창으로 나눌 수 있습니다. 왼쪽 창에는 행의 접두사가 표시되고, 가운데 창에는 중간 부분이 표시되며, 오른쪽 창에는 가로로 스크롤할 수 있는 접두사 뒤의 나머지 행이 표시됩니다.
답변3
를 사용하면 쉽게 이 작업을 수행할 수 있습니다 tput
. 화면을 지우지 않고 명령의 마지막 n 줄을 추적하는 zsh 함수를 만들었습니다. 저는 MacOS 12.6 Monterey를 실행하는 m1 Mac에서만 이것을 테스트했습니다.
function tail_lines () {
# save cursor position
tput sc
tput ed
# if is a number
# `<->' is a special zsh pattern to match any number, an extension of forms like `<1-100>' which matches any number in the range 1 to 100 inclusive
# https://zsh.sourceforge.io/Guide/zshguide03.html
if [[ "$1" = <-> ]]; then
nlines=$1
else
nlines=5
fi
YELLOW=$(tput setaf 3)
NORMAL_COLOR=$(tput sgr0)
while IFS= read -r line; do
# restore cursor position
tput rc
if [ -z "$output" ]; then
output=" $line"
else
output=`echo "$output\n $line" | tail -n $nlines`
fi
printf -- "${YELLOW}$output${NORMAL_COLOR}\n"
done < /dev/stdin
tput rc
tput ed || tput 'cd'
}
용법
brew update | tail_lines
또는
brew update | tail_line 10
답변4
노력하다
docker build > logfile &
tail -3 -f logfile
-f 원하는 대로 수행되지만 파이프에서는 작동하지 않으므로 중간 파일이 필요합니다.