ロギング目的で出力の最初の5行だけが必要であるとします。また、ログが切り捨てられるかどうかと時期を知る必要があります。
head
次のコマンドを使用してこれを実行しようとしましたが、切り捨てられたseq
20行を出力し、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...