防止手表损坏颜色

Ken*_* Oh 6 colors printf

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

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

123456
Run Code Online (Sandbox Code Playgroud)

我在 perl 中输入了这个(或者,在 bash 中输入了很多相同的东西):

"\e[1;34m" . $num . "\e[0m"
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

[1;34m123456[0m 
Run Code Online (Sandbox Code Playgroud)

我也试过这个,一个转义版本,但得到同样的东西:

"\x1B[1;34m" . $num . "\x1B[0m"
Run Code Online (Sandbox Code Playgroud)

如果这有所作为,这里是真正的脚本堆栈(一团糟):

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

也许watch不喜欢颜色呢?

perl不太清楚,所以我想显示我在打印线周围看到的内容不会有什么坏处:

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

printf("$format\n", @$_)
Run Code Online (Sandbox Code Playgroud)

lor*_*nix 7

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

所以我把它拼凑在一起,放在我的.bashrc 中,允许我使用我自己的所有别名、快捷方式等等:

Usage:
    watcher 20 'somecommand | apipe | grep'
Run Code Online (Sandbox Code Playgroud)

该数字是更新之间的延迟,以秒为单位,该命令可以包含您可以引用的任何内容。

###### '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 ; }
Run Code Online (Sandbox Code Playgroud)

分解:

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
}
Run Code Online (Sandbox Code Playgroud)

它以行为单位确定当前屏幕高度,减去足够自己的输出,然后重复执行给定的命令,然后清除屏幕,显示输出并等待下一个循环。它在底部显示一个简短的“==”,表示这是输出结束的地方。有时知道这一点很有帮助。

我这样做是为了在显示时有最小的延迟。如果你不捕获输出然后显示,你会暂停很长时间,然后输出...... icky。

由于它不会破坏颜色,因此您可以获得习惯的一切。享受!


jw0*_*013 6

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

  • 哦...看起来`--color` 不在RHEL 4 的`watch` 中。 (2认同)

Ale*_*ios 6

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

您可以通过遵循jw013lornix 的明智建议来解决此问题:使用watch --color或将脚本包装在while true; do clear; $SCRIPT; sleep 2; done循环之类的东西中。