Pipe

顯示命令輸出的最後 n 行

  • May 7, 2022

我正在嘗試執行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”行?

#!/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 < /dev/stdin

使其可執行(chmod +x nlines.sh),然後連續列印 3 行,

docker build | ./nlines.sh 3

  • clear清除螢幕。每當一行來自標準輸入時,都會這樣做。
  • 這會將新讀取的行添加到變數all
all="$all
$line"
  • [ "$i" -ge "$nlines" ]測試是否達到了要顯示的最大行數。如果是,

    • 這會從變數中刪除最舊的行。
all="${all#*
}"

引用自:https://unix.stackexchange.com/questions/598508