Usando sed per colorare l'output di un comando su solaris


29

Ho uno script ksh che deve funzionare sia su Linux che su Solaris. Sto cercando di colorare l'output di comandi specifici. Funziona su Linux (in particolare RHEL6), ma non su Solaris (SunOS 5.10).

Comando su Linux (l'output "test" è correttamente colorato in rosso):

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

Comando su solaris (l'uscita "test" non è colorata):

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

C'è un modo per creare questo comando in modo che l'output sia rosso, senza i codici grezzi nell'output? Non posso cambiare il comando 'echo' perché è solo un riempimento per il comando che sto effettivamente eseguendo.

Risposte:


35

\xNN è una sequenza di escape in GNU sed, ma non è standard e in particolare non è disponibile su Solaris.

Puoi includere un carattere letterale di escape nel tuo script, ma ciò renderebbe difficile la lettura e la modifica.

È possibile utilizzare printfper generare un carattere di escape. Comprende le fughe ottali, non esadecimali.

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

È possibile chiamare tputper generare il testo sostitutivo nella chiamata a sed. Questo comando cerca sequenze di escape nel database terminfo . In teoria, l'utilizzo tputrende il tuo script più portatile, ma in pratica è improbabile che tu incontri un terminale che non utilizza i codici di escape ANSI .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"

funziona benissimo da colorare su un cat |sedtroppo grazie!
Aquarius Power il

8

Sarebbe più facile da usare tput

tput setaf 1; somecommand; tput sgr0

o

tput setaf 1
somecommand
tput sgr0

In questo modo il primo piano viene impostato su rosso, le esecuzioni somecommandche visualizzeranno quindi l'output in rosso quindi cancellano la sequenza dei colori. Questo funziona almeno con bash, zshe ksh.

Vedi tmux(1)e terminfo(5)per maggiori informazioni su cosa puoi fare tput.


Grazie per la risposta. Come ho detto prima, non posso cambiare il comando echo. 'echo' è solo uno stand-in per il processo che sto chiamando, che non posso cambiare. È possibile usare sed con tput in qualche modo? Inoltre, quando eseguo quel comando su sunOS 5.10 non vedo alcun colore.
acm

L'ho aggiornato per scomporlo in comandi separati.
bahamat,

Questo è meglio della mia attuale implementazione in quanto non stampa codici ASCII grezzi su Solaris. Tuttavia (per qualsiasi motivo), non colora l'output di "somecommand" su solaris. Lo fa su Linux. Ho accettato la risposta di @Gilles, che fa entrambe le cose. Grazie.
acm

0

Alcuni terminali (come bash in iterm per me) ti permettono di premere i tasti "ctrl-v" seguito da "ctrl + [" e inserirà il carattere letterale escape nella stringa di input. Se funziona, probabilmente vedrai i caratteri "^ [" stampati sullo schermo, ma se muovi il cursore attorno ad esso, lo tratterà come un personaggio perché è davvero dietro le quinte.

Per capire cosa sta succedendo (e per verificare se ciò è possibile), puoi digitare ctrl + v seguito da ctrl + i. Dovresti vedere che il carattere di tabulazione è stato inserito nella stringa del prompt. C'è una storia CS per cui questo è il caso: ma si scopre che la tastiera molto vecchia aveva ctrl + I cablato per inviare il carattere tab; e il tasto tab invia anche lo stesso segnale elettrico.

Per quel motivo legacy, bash per molti terminali interpreta ancora certi codici ctrl per mappare a quegli stessi caratteri.

Ctrl + I si associa al carattere di tabulazione e ctrl + [sembra corrispondere al carattere di escape ASCII.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.