ファイルの始まりと終わりを見るBashメソッド

ファイルの始まりと終わりを見るBashメソッド

キューベースのクラスタでは、保留中のジョブのキューがコマンドとともに表示されます(例:)showqueue

このコマンドは、名前などの列の合理的なデータのリストを返しますが、列/データは質問にとって重要ではありません。

watch私は時々このユーティリティを使うのが好きですwatch showqueue(別名を使ってalias watch="watch "私のコマンドの別名拡張を強制的に監視します)。最初の数行には重要なデータ(実行中のジョブ)、保留中のジョブなどがあり、最後にいくつかの重要な要約があります。

しかし、時々showqueueの出力が画面から外れることがあります(信じられません。私も知っています)!理想的には、ファイルの始まりと終わりの両方を見る方法があります。

これまでに私が持っていたものの中で最高は:showqueue > file; head -n 20 file > file2; echo "..." >> file2 ; tail -n 20 file >> file2; cat file2であり、watchエイリアスを使用することです。

より柔軟でシンプルなユーティリティを知っている人はいますか?私の解決策は少し悪いことが判明しました。 bashループは「...」を複数行にして、ターミナルウィンドウのサイズ変更にはまったく適応しておらず、もっと見逃していたでしょう。

どんな提案がありますか?

答え1

次のようなことをしますか?頭と尾の出力を表示します。

$ showqueue | (head && tail)

答え2

一時ファイルを使用して同じ方法を使用しますが、少し短いです。

showqueue >/tmp/q.out; head -n 20 /tmp/q.out; echo '...'; tail -n 20 /tmp/q.out

これは、議論された同じ問題のために困難を経験しません。他の答えで、しかし会議出力が40行未満の場合、同じ行が2回表示されることがあります。

答え3

頭と尾に必要な数の行を表示するawkソリューション(n=3セット番号の変更):

$ seq 99999 | awk -v n=3 'NR <= n; NR > n { a[NR] = $0; delete a[NR-n]; } 
     END { print "..."; for (i = NR-n+1; i <= NR; i++) if (i in a) print a[i]; }'
1
2
3
...
99997
99998
99999

書かれたように頭と尾いいえ入力が2*nラインより短い場合でも重なります。

一部のawk実装では、for (x in a) print a[x];inEND部分を使用することも可能です。しかし、通常、配列項目が正しい順序で返されるという保証はありません。たとえば、mawkの場合はそうではありません。

答え4

単純な awk スクリプトを使用できます。最後の3行にn = 3の循環バッファを追加しました。

awk 'NR<=n {print $0} { A[NR%n]=$0 } END { for (i=1; i<=n; ++i) if (NR+i>2*n)print A[(NR+i)%n] }' n=3 < <( seq 10 )

更新後はもう簡単ではありません。

関連情報