
特定の項目を選択して色を指定するために、ログファイルを監視するスクリプトを職場で変更しています。最終出力は、複数の列にある6桁の数字のリストです。数字の先頭にaを追加することができ、~
最終出力では何も壊れませんでしたが、かなり見苦しく、読みにくいです。ただし、以前のbashスクリプトまたはPerlスクリプトのデータ最終処理で数字に色を付けようとすると、カラーテキストが破損します。
たとえば、生の数字を入力します$num
。
123456
私はこれをPerlとして入力します(またはBashでもほぼ同じものを入力します):
"\e[1;34m" . $num . "\e[0m"
これが私が得るものです:
[1;34m123456[0m
私もエスケープバージョンを試しましたが、同じ結果を得ました。
"\x1B[1;34m" . $num . "\x1B[0m"
違いがある場合、実際のスクリプトスタックは次のようになります(混乱)。
- Perlは内部シェルスクリプトを呼び出してから
grep
/cut
などにパイプされます。 - シェルスクリプトにはより多くの
cut
/ etcが含まれており、.plにパイプされています。 - シェルスクリプトはこの出力を監視します。
watch
たぶん色が好きではありませんか?
私はそれについてあまり知らないので、perl
印刷ラインの周りに見えるものを示すのは悪いと思いました。
my $format = ("%-8s") x scalar(@{$a[0]});
printf("$format\n", @$_)
答え1
「色の盗難」の問題があります。より、これはウォッチが単純な/bin/sh出力スタイルを使用しているので、すべての色、エイリアス、ショートカットなど全体を破ることができるからです!
だからそれを集めて私の中に入れておいた。.bashrc、マイエイリアス、ショートカットなどをすべて使用できます。
Usage:
watcher 20 'somecommand | apipe | grep'
この数は更新間の遅延時間(秒単位)であり、コマンドには引用可能なすべての内容を含めることができます。
###### 'watch' workalike, lets me use my aliases and such
function watcher() { WATCHERTIME=$1 ; WATCHERFILE=/tmp/watcher$$ ; shift ; while true ; do WATCHERHEIGHT=$(($LINES - 5)) ; ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null; clear ; /bin/echo -n "Every ${WATCHERTIME} seconds - " ; date ; /bin/echo ; cat ${WATCHERFILE} ; \rm -f ${WATCHERFILE} ; /bin/echo ; /bin/echo "==" ; sleep ${WATCHERTIME} ; done ; }
それを破壊する:
function watcher()
{
WATCHERTIME=$1
WATCHERFILE=/tmp/watcher$$
shift
while true; do
WATCHERHEIGHT=$(($LINES - 5))
( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null
clear
/bin/echo -n "Every ${WATCHERTIME} seconds - "
date
/bin/echo
cat ${WATCHERFILE}
\rm -f ${WATCHERFILE}
/bin/echo
/bin/echo "=="
sleep ${WATCHERTIME}
done
}
現在の画面の高さを行単位で決定し、それ自体の出力に十分な行を引いて、指定されたコマンドを繰り返し実行し、画面を消去して出力を表示し、次のループを待ちます。出力の終わりを示すために、下部に短い「==」を表示します。時にはこれを知ることが役に立ちます。
表示するときの待ち時間を最小限に抑えるためにこれを行います。出力をキャプチャせずに表示すると、長い一時停止が発生し、出力が...迷惑になります。
色を台無しにしないので、おなじみのすべてを手に入れることができます。楽しむ!
答え2
答え3
--color
を選択する必要がありますwatch
。