毎晩cronジョブでいくつかのシェルスクリプトを実行するJava実行可能ファイル(jar)があります。実行可能ファイルは1行ずつ順番に(印刷後に印刷)ログステートメントを「通常通り」に印刷しませんが、データを処理するときにステータスデータを含む1行を印刷してから「上書き」またはプロセスのこの部分を完了します。なるまでこの行を続けて「更新」します。
例:
汎用プログラムは以下を出力します。
Program XYZ started..<cr+lf>
processing 1<cr+lf>
processing 2<cr+lf>
processing 3<cr+lf>
im done<cr+lf>
シンプル!出力をファイルに簡単にリダイレクトでき、完了します。
しかし、私が扱うべきプログラムは次のとおりです。
Program XYZ started..<cr+lf>
processing 1<cr>
processing 1 - part a<cr>
processing 1 - part b<cr>
processing 1 - part c<cr>
processing 1 - part d<cr>
<cr+lf>
processing 2<cr>
processing 2 - part a<cr>
processing 2 - part b<cr>
processing 2 - part c<cr>
processing 2 - part d<cr>
<cr+lf>
processing 3<cr+lf>
im done<cr+lf>
しかし、私がここに示すよりもはるかに密度が高いです。したがって、常にステータスバーを上書きするわけではありませんが、たくさん処理中。したがって、ログファイルに出力をリダイレクトまたは追加するだけでは、人が簡単に見て理解できない数百万の画面更新でログファイルを複雑にするため、ここではあまり意味がないようです。
だから私の質問は:プログラムが30秒ごとに出力をログファイルに「ログ」または「スクリーンショット」できるようにする方法やツールはありますか?
答え1
簡単に言えば、処理するvt100エスケープがないと仮定すると、出力を次にプッシュしてみることができます。
sed 's/\r$//; s/.*\r//'
またはawkに対応するもの
awk '{ sub("\r$",""); sub(".*\r",""); print}'
ただし、これはキャリッジリターンが明らかに改行ではないため、sedまたはawkが非常に長い行を処理できると仮定します。また、キャリッジリターンはカーソルを行の先頭にのみ移動しますが、その行の内容を削除しません。したがって、厳密に言えば、\r\r\n
例では以前の長い行を維持する必要があります。
tr '\r\n' '\n\001'
有効な長い行を処理するには、改行文字に変換を使用し、改行文字を\r
control-aなどのデータにない他の文字に変換することもできます。
RS='\r'
または、awk で許可されている場合は、Change awk の入力レコード区切り文字を使用できます。これにより、次のスクリプトが提供されます。
awk -v RS='\r' '
{ if(sub("\n","")){print last;last=""}
if($0!="")last = $0
}'
答え2
私はどちらかを使用しますscript2log
(単純)またはvile-pager
(viはemacsのように)このようなことのために。このスクリプトは、上記のタイプの再入力とバックスペース/再入力を処理します。コマンドライン編集などのカーソル移動を処理するには、このような単純なスクリプトだけでは不十分です。ただし、スクリプトはANSIスタイルのエスケープシーケンスを削除します。
これスクリプトの使い方sed
。これは単にsedコマンドです:
#通常のANSIシーケンスをトリミングし、OSCシーケンスをトリミングしてバックスペースします。 #シーケンス、末尾のCR、最後にすごい部分 #いいね。 # #まだ処理できない興味深い状況がいくつかあります。 #そのようなスクリプトを使用してください。たとえば、 #CSI K(クリアライン) #行内でカーソルを移動します。 sed\ -e 's/[[][?]\{0,1\}[;0-9]*[@-~]//g' \ -e's/[]][^]*//g'\ -e's/[]][^]*\\//g'\ -e': ループ; s/[^]\(.\)/\1/g; -e's/*$//g'\ -e 's/^.* //g' \ -e's/[^[]//g'
POSIX以外の拡張に依存せず、リテラルエスケープ文字を含みます。
追加資料: