我正在更改监控日志文件的工作脚本,以挑选出某些项目并为它们着色。最终输出是多列中的 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)
如果这有所作为,这里是真正的脚本堆栈(一团糟):
grep
/ cut
/etc。cut
/etc. 的shell 脚本,然后通过管道传输到 .pl也许watch
不喜欢颜色呢?
我perl
不太清楚,所以我想显示我在打印线周围看到的内容不会有什么坏处:
my $format = ("%-8s") x scalar(@{$a[0]});
printf("$format\n", @$_)
Run Code Online (Sandbox Code Playgroud)
我遇到了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。
由于它不会破坏颜色,因此您可以获得习惯的一切。享受!
问题是watch
使用 Curses 和curses
字符串输出函数在虚拟帧缓冲区上工作,该缓冲区具有用于字符及其属性/颜色的单独平面。字符串按原样发送到帧缓冲区,没有终端指令解释。为了防止终止状态的破坏,Curses 会忽略ESC
(除其他外),因此watch
默认情况下不会进行颜色处理。
您可以通过遵循jw013或lornix 的明智建议来解决此问题:使用watch --color
或将脚本包装在while true; do clear; $SCRIPT; sleep 2; done
循环之类的东西中。