Estoy alterando scripts en el trabajo que monitorean archivos de registro para seleccionar ciertos elementos y colorearlos. El resultado final es una lista de números de 6 dígitos en varias columnas. Pude agregar un ~
al comienzo del número y no interrumpe nada en el resultado final, pero es bastante feo y difícil de leer. Sin embargo, cuando intento colorear el número, ya sea en scripts bash anteriores o en el procesamiento final de los datos en un script perl, el texto en color se altera.
Por ejemplo, el número original, que pondré en $num
:
123456
Ingresé esto en perl (o lo mismo en bash):
"\e[1;34m" . $num . "\e[0m"
Y esto es lo que obtengo:
[1;34m123456[0m
También probé esta, una versión escapada, pero obtengo lo mismo:
"\x1B[1;34m" . $num . "\x1B[0m"
Si esto marca la diferencia, aquí está la verdadera pila de scripts (es un desastre):
- Perl llama dentro del script de shell, que luego canaliza a
grep
/cut
/etc. - script de shell con más
cut
/etc., luego canaliza a .pl - El script de shell vigila esa salida.
¿Quizás watch
entonces no le gusta el color?
No lo sé perl
muy bien, así que supongo que no estaría de más mostrar lo que veo alrededor de las líneas impresas:
my $format = ("%-8s") x scalar(@{$a[0]});
printf("$format\n", @$_)
Respuesta1
Encontré los problemas de "robo de color" conmirar, es porque watch usa un estilo de salida simple /bin/sh, que elimina cualquier color, alias, atajos... ¡todo el asunto!
Así que improvisé esto y lo coloqué en mi.bashrc, me permite usar todos mis propios alias, atajos y todo eso:
Usage:
watcher 20 'somecommand | apipe | grep'
El número es el retraso entre actualizaciones; en segundos, el comando puede incluir cualquier cosa que puedas citar.
###### '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 ; }
Para desglosarlo:
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
}
Determina la altura actual de la pantalla en líneas, resta lo suficiente para su propia salida, luego ejecuta repetidamente el comando dado, luego limpia la pantalla, muestra la salida y espera el siguiente bucle. Muestra un '==' corto en la parte inferior para indicar que ahí es donde terminó la salida. A veces es útil saber esto.
Lo hice de esta manera para que hubiera el menor retraso posible en la visualización. si no captura la salida y luego la muestra, obtiene una pausa larga, luego la salida... repugnante.
Como no afecta los colores, obtienes todo lo que estás acostumbrado a obtener. ¡Disfrutar!
Respuesta2
El problema es que watch
los usos de Curses y las curses
funciones de salida de cadenas funcionan en un framebuffer virtual con planos separados para los caracteres y sus atributos/colores. Las cadenas se envían al framebuffer tal cual, sin interpretación de directiva de terminal. Para protegerse contra la destrucción del estado terminal, Curses ignora ESC
(entre otras cosas), por lo que watch
no utilizará el color de forma predeterminada.
Puedes solucionarlo siguiendo los sabios consejos de cualquiera de los dos.jw013olornix: use watch --color
o ajuste su script en algo así como un while true; do clear; $SCRIPT; sleep 2; done
bucle.
Respuesta3
Probablemente necesites la --color
opción watch
.