Piping di un comando attraverso un filtro colorato


13

Esiste qualcosa di simile in Unix?

$ echo "this should show in red" | red
$ echo "this should show in green" | green
$ echo "this should show in blue" | blue

Qui non intendo che venga visualizzato il testo letterale con codice colore (da incollare in un file, ad esempio). Intendo solo che il testo viene effettivamente visualizzato nel terminale come quel colore. È possibile?

Risposte:


14

Ecco una piccola sceneggiatura che fa proprio questo. Salvalo come colorin una directory nella tua $PATH(ad esempio, ~/binse è nella tua $PATH):

#!/usr/bin/env perl

use strict;
use warnings;
use Term::ANSIColor; 

my $color=shift;
while (<>) {
    print color("$color").$_.color("reset");
} 

Quindi, passa il testo attraverso lo script, fornendo .come modello da abbinare e specificando un colore:

screenshot di un terminale che esegue lo script

I colori supportati dipendono dalle capacità del tuo terminale. Per maggiori dettagli, consultare la documentazione del Term::ANSIColorpacchetto.


Esiste un elenco di colori validi per passare da qualche parte?
George,

@George che dipende dalla tua configurazione. Se hai un terminale compatibile con RGB, puoi persino usare cose come rgb001, rgb123ecc. Vedi perldoc.perl.org/Term/ANSIColor.html#Supported-Colors per maggiori dettagli.
terdon

23

Utilizzeresti tputper quello:

tput setaf 1
echo This is red
tput sgr0
echo This is back to normal

Questo può essere usato per costruire una pipe:

red() { tput setaf 1; cat; tput sgr0; }
echo This is red | red

I colori di base sono rispettivamente nero (0), rosso (1), verde, giallo, blu, magenta, ciano e bianco (7). Troverai tutti i dettagli nella terminfo(5)manpage .


6

Con zsh:

autoload colors; colors
for color (${(k)fg})
  eval "$color() {print -n \$fg[$color]; cat; print -n \$reset_color}"

E poi:

$ echo "while" | blue
while

1

(come discusso nei commenti, usatput invece se ce l'hai)

Utilizzo della shell bourne e del echocomando (integrato) che comprende la fuga ANSI \econ l' -eopzione:

black()  { IFS= ; while read -r line; do echo -e '\e[30m'$line'\e[0m'; done; }
red()    { IFS= ; while read -r line; do echo -e '\e[31m'$line'\e[0m'; done; }
green()  { IFS= ; while read -r line; do echo -e '\e[32m'$line'\e[0m'; done; }
yellow() { IFS= ; while read -r line; do echo -e '\e[33m'$line'\e[0m'; done; }
blue()   { IFS= ; while read -r line; do echo -e '\e[34m'$line'\e[0m'; done; }
purple() { IFS= ; while read -r line; do echo -e '\e[35m'$line'\e[0m'; done; }
cyan()   { IFS= ; while read -r line; do echo -e '\e[36m'$line'\e[0m'; done; }
white()  { IFS= ; while read -r line; do echo -e '\e[37m'$line'\e[0m'; done; }

echo '    foo\n    bar' | red

o, più script di shell generico (diciamo, /usr/local/bin/colorize):

#!/bin/sh

usage() {
    echo 'usage:' >&2
    echo '  some-command | colorize {black, red, green, yellow, blue, purple, cyan, white}' >&2
    exit 1
}

[ -z "$1" ] && usage

case $1 in
    black)  color='\e[30m' ;;
    red)    color='\e[31m' ;;
    green)  color='\e[32m' ;;
    yellow) color='\e[33m' ;;
    blue)   color='\e[34m' ;;
    purple) color='\e[35m' ;;
    cyan)   color='\e[36m' ;;
    white)  color='\e[36m' ;;
    *) usage ;;
esac

IFS=
while read -r line; do
    echo -e $color$line'\e[0m'
done

IFS=è necessario per evitare il taglio degli spazi bianchi (vedere POSIX per i dettagli).

come funziona IFS


Consiglio di preferire l'utilizzo tput.
LinuxSecurityFreak

Questa è una soluzione completamente non portatile. Voglio dire che dovresti aderire a POSIX.
LinuxSecurityFreak

1
Certo, se potessimo. È stato progettato per essere utilizzato su sistemi incorporati o ambienti di salvataggio come busybox. Ho deciso di scrivere questa risposta perché credo che questi frammenti di codice siano utili in alcune situazioni - almeno per gli utenti di busybox e per me, che oggi ho dovuto produrre i colori solo con i comandi integrati della shell in un ambiente incorporato.
wataash,

ho dimenticato di dire che la normale busybox non ha tput.
wataash,
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.