防止手表断色

防止手表断色

我正在更改工作中监视日志文件的脚本,以挑选出某些项目并为它们着色。最终输出是一个由几列组成的 6 位数字的列表。我已经能够~在数字的开头添加 a ,并且它不会破坏最终输出中的任何内容,但它相当丑陋且难以阅读。然而,当我尝试对数字进行着色时,无论是在前面的 bash 脚本中还是在 Perl 脚本中对数据的最终处理中,颜色文本都会被破坏。

例如,原始数字,我将放入$num

123456

我在 perl 中输入这个(或者在 bash 中输入大致相同的内容):

"\e[1;34m" . $num . "\e[0m"

这就是我得到的:

[1;34m123456[0m 

我也尝试过这个,一个转义版本,但得到了同样的结果:

"\x1B[1;34m" . $num . "\x1B[0m"

如果这有什么不同,这里是真正的脚本堆栈(一团糟):

  • Perl 调用内部 shell 脚本,然后通过管道传输到grep/ cut/etc。
  • shell 脚本包含更多cut/etc.,然后通过管道传输到 .pl
  • shell 脚本监视该输出

也许watch不喜欢颜色?

我不太了解perl,所以我想展示我在打印行周围看到的内容不会有什么坏处:

my $format = ("%-8s") x scalar(@{$a[0]});

printf("$format\n", @$_)

答案1

我遇到了“颜色窃取”问题手表,这是因为 watch 使用简单的 /bin/sh 输出样式,它会破坏任何颜色、别名、快捷方式......整个 shebang!

所以我把它拼凑起来,放在我的.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

问题是watch使用 Curses 和curses字符串输出函数在虚拟帧缓冲区上工作,该虚拟帧缓冲区具有单独的字符及其属性/颜色平面。字符串按原样发送到帧缓冲区,没有终端指令解释。为了防止破坏最终状态,Curses 会忽略ESC(除其他外),因此watch默认情况下不会执行颜色。

您可以按照以下任一者的明智建议来解决此问题jw013或者洛尼克斯:使用watch --color或将脚本包装在类似while true; do clear; $SCRIPT; sleep 2; done循环的内容中。

答案3

您可能需要--color选择watch.

相关内容