Usando sed para colorear la salida de un comando en solaris

29

Tengo un script ksh que debe funcionar tanto en Linux como en Solaris. Estoy tratando de colorear la salida de comandos específicos. Funciona en Linux (específicamente RHEL6), pero no en Solaris (SunOS 5.10).

Comando en Linux (la "prueba" de salida está correctamente coloreada en rojo):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

Comando en solaris (la "prueba" de salida no está coloreada):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

¿Hay alguna manera de elaborar este comando de modo que la salida sea roja, sin los códigos sin formato en la salida? No puedo cambiar el comando 'echo' porque eso es solo un relleno para el comando que realmente estoy ejecutando.

acm
fuente

Respuestas:

35

\xNN es una secuencia de escape en GNU sed, pero no es estándar y, en particular, no está disponible en Solaris.

Puede incluir un carácter de escape literal en su secuencia de comandos, pero eso dificultaría la lectura y la edición.

Puedes usar printfpara generar un personaje de escape. Entiende escapes octales, no hexadecimales.

esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

Puede llamar tputpara generar el texto de reemplazo en la llamada a sed. Este comando busca secuencias de escape en la base de datos terminfo . En teoría, el uso tputhace que su script sea más portátil, pero en la práctica es poco probable que encuentre un terminal que no use códigos de escape ANSI .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
Gilles 'SO- deja de ser malvado'
fuente
¡Esto funciona muy bien para colorear en un cat |sedthx demasiado!
Acuario Power
8

Sería más fácil de usar tput

tput setaf 1; somecommand; tput sgr0

o

tput setaf 1
somecommand
tput sgr0

Esto establece el primer plano en rojo, las ejecuciones somecommandque luego mostrarán la salida en rojo y luego borran la secuencia de colores. Esto funciona al menos con bash, zshy ksh.

Consulte tmux(1)y terminfo(5)para obtener más información sobre lo que puede hacer con tput.

bahamat
fuente
Gracias por la respuesta. Como dije antes, no puedo cambiar el comando echo. 'echo' es solo un sustituto del proceso al que llamo, que no puedo cambiar. ¿Es posible usar sed con tput de alguna manera? Además, cuando ejecuto ese comando en sunOS 5.10 no veo ningún color.
acm
Lo actualicé para dividirlo en comandos separados.
bahamat
Esto es mejor que mi implementación actual, ya que no imprime códigos ASCII sin procesar en Solaris. Sin embargo (por cualquier razón), no da color a la salida de 'algún comando' en solaris. Lo hace en linux. He aceptado la respuesta de @Gilles, que hace ambas cosas. Gracias.
acm
0

Algunos terminales (como bash in iterm para mí) le permiten presionar las teclas "ctrl-v" seguidas de "ctrl + [" y colocará el carácter de escape literal en la cadena de entrada. Si funciona, probablemente verá los caracteres "^ [" impresos en la pantalla, pero si mueve el cursor alrededor de él, lo tratará como un carácter porque realmente está detrás de escena.

Para comprender lo que está sucediendo (y probar si esto es posible), puede escribir ctrl + v seguido de ctrl + i. Debería ver que el carácter de tabulación se insertó en su cadena de solicitud. Hay un historial de CS de por qué este es el caso: pero resulta que el teclado realmente viejo tenía Ctrl + I conectado para enviar el carácter de tabulación; y la tecla tab también envía esa misma señal eléctrica.

Por esa razón heredada, bash para muchos terminales todavía interpreta ciertos códigos Ctrl para asignar a esos mismos caracteres.

Ctrl + I se asigna al carácter de tabulación y ctrl + [coincide con el carácter de escape ASCII.

Alexander Bird
fuente