コマンド出力の最後の n 行を表示します。

コマンド出力の最後の n 行を表示します。

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#*
}"

おすすめ記事