X行の後ろの出力を切り捨て、出力が切り捨てられた場合にのみメッセージを印刷します。

X行の後ろの出力を切り捨て、出力が切り捨てられた場合にのみメッセージを印刷します。

ロギング目的で出力の最初の5行だけが必要であるとします。また、ログが切り捨てられるかどうかと時期を知る必要があります。

head次のコマンドを使用してこれを実行しようとしましたが、切り捨てられたseq20行を出力し、head情報echoも切り捨てました。

 > seq -f 'log line %.0f' 20 | head -n 5 && echo '...Output truncated. Only showing first 5 lines...'
log line 1
log line 2
log line 3
log line 4
log line 5
...Output truncated. Only showing first 5 lines...

ただし、seq上記と同じ設定を使用してコマンド出力が5行未満の場合、無効な「切り捨て」ステータスが表示されます。

seq -f ' log line %.0f' 3 | head -n 5 && echo '...Output truncated. Only showing first 5 lines...'
log line 1
log line 2
log line 3
...Output truncated. Only showing first 5 lines...

head必要に応じて「...truncated...」メッセージのみを表示するようにコマンド(または他のツール)が切り捨てられた部分があるかどうかを知らせる方法はありますか?

答え1

警告指示:

これを行うとき:

cmd | head

出力が切り捨てられた場合、cmd終了後にさらに行を書き込むと、SIGPIPEによって終了する可能性があります。headこれが望ましくない場合は、cmd出力が削除されてもその後も実行を続けるには、10行の出力後に終了するのではなく、残りの行を読み取って削除する必要があります(たとえば、またはに置き換えますsed '1,10!d')。awk 'NR<=10'head

したがって、2つの異なるアプローチの場合:

出力が切り捨てられ、cmdが終了する可能性があります。

cmd | awk 'NR>5 {print "TRUNCATED"; exit}; {print}'
cmd | sed  '6{s/.*/TRUNCATED/;q;}'

mawkこの実装は入力処理を開始する前にバッファー入力入力をawk蓄積するため、cmdバッファー・フィル(マイ・システムAFAICTでは8KiB)データが書き込まれるまで終了しない可能性があります。このオプションを使用すると、この問題を解決できます-Winteractive

一部のsed実装では、1行を事前に読み取って(アドレスを使用したときにどの行が最後であるかを知ることができるように$)、これらの実装では7行cmd出力されるまで終了しないことがあります。

出力が切り捨てられ、残りは破棄されるため、cmdは終了しません。

cmd | awk 'NR<=5; NR==6{print "TRUNCATED"}'
cmd | sed '1,6!d;6s/.*/TRUNCATED/'

答え2

AWKを使用できます。

seq -f 'line %.0f' 20 | awk 'NR <= 5; NR > 5 { print "...Output truncated. Only showing first 5 lines..."; exit }'

これにより、最初の5行(ある場合)がそのまま印刷されます。それ以上の行がある場合は、切り捨てメッセージが印刷され、終了します。

条件付き処理を実装するには、使用する終了コードを指定できます。

seq -f 'line %.0f' 20 | awk 'NR <= 5; NR > 5 { exit 1 }' || echo ...Output truncated. Only showing first 5 lines...

関連情報