Pipable-Befehl zum Drucken in Farbe?

8

Ich bin ein bisschen neu in der Bash-Skripterstellung und frage mich, ob es ein Programm oder einen eingebauten Befehl zum Weiterleiten gibt, der in einer bestimmten Farbe gedruckt wird. Oder gibt es dafür ein Echo-Argument?

Wie ich tun könnte:

echo Hi | commandhere -arguement blue

und es würde "Hi" in der Farbe blau drucken?

TenorB
quelle
Ich habe so grcgearbeitet und nicht als Präfixbefehl.
Sridhar Sarnobat

Antworten:

11

Ich kenne kein Dienstprogramm für den Farbdruck selbst, aber mit einer Shell-Funktion wie der folgenden können Sie dies problemlos tun:

# colorize stdin according to parameter passed (GREEN, CYAN, BLUE, YELLOW)
colorize(){
    GREEN="\033[0;32m"
    CYAN="\033[0;36m"
    GRAY="\033[0;37m"
    BLUE="\033[0;34m"
    YELLOW="\033[0;33m"
    NORMAL="\033[m"
    color=\$${1:-NORMAL}
    # activate color passed as argument
    echo -ne "`eval echo ${color}`"
    # read stdin (pipe) and print from it:
    cat
    # Note: if instead of reading from the pipe, you wanted to print
    # the additional parameters of the function, you could do:
    # shift; echo $*
    # back to normal (no color)
    echo -ne "${NORMAL}"
}
echo hi | colorize GREEN

Wenn Sie andere Farben überprüfen möchten, sehen Sie sich diese Liste an . Von dort aus können Sie Unterstützung für jede Farbe hinzufügen, indem Sie bei dieser Funktion einfach eine zusätzliche Variable mit dem richtigen Namen und Wert erstellen.

elias
quelle
Also habe ich dies einfach in die Datei "colorize" eingefügt, als ausführbar markiert und in / etc / bin eingefügt?
TenorB
Sie können die Funktion einfach auf Ihre kopieren .bashrc.
Elias
1
Wenn Sie jedoch wirklich eine ausführbare Datei erstellen möchten, sollten Sie alles aus der Funktion (innerhalb der Klammern) kopieren und in eine Datei "colorize" einfügen, diese als ausführbar markieren und in einem Verzeichnis in Ihrer $ PATH-Variablen ablegen ( /usr/local/binis ein guter Ort)
Elias
Wenn Sie wie ich sind und nur versuchen, mehr über Bash-Skripte zu erfahren, finden Sie hier ein weiteres Skript , das eine sehr ähnliche Funktion ausführt. Interessant, diese beiden Skripte zu vergleichen. Ich mache meine eigenen, um sie zu kombinieren.
Driftcatcher
3

Ich habe diese Funktion erstellt, die ich in Bash-Skripten verwende.

# Funktion zum Echo in der angegebenen Farbe
echoincolor () {
    Fall $ 1 in
        "rot") tput setaf 1 ;;
        "grün") tput setaf 2 ;;
        "orange") tput setaf 3 ;;
        "blau") tput setaf 4 ;;
        "lila") tput setaf 5 ;;
        "cyan") tput setaf 6 ;;
        "grau" | "grau") tput setaf 7 ;;
        "weiß") tput setaf 8 ;;
    esac
    Echo "$ 2";
    tput sgr0
}}

Dann nenne ich es einfach so echoincolor green "This text is in green!"

Alternativ verwendenprintf

# Funktion zum Drucken in der angegebenen Farbe
colorprintf () {
    Fall $ 1 in
        "rot") tput setaf 1 ;;
        "grün") tput setaf 2 ;;
        "orange") tput setaf 3 ;;
        "blau") tput setaf 4 ;;
        "lila") tput setaf 5 ;;
        "cyan") tput setaf 6 ;;
        "grau" | "grau") tput setaf 7 ;;
        "weiß") tput setaf 8 ;;
    esac
    printf "$ 2";
    tput sgr0
}}

Dann nenne es einfach so colorprintf green "This text is in green!"

Hinweis : echoStellt eine nachfolgende neue Zeile bereit, dies printfjedoch nicht.

HarlemSquirrel
quelle
1

Ich benutze dieses alte Skript mit dem Namen hilite.pl aus dem Internet, bereits mit der Zeile "unbekannter Autor"!

#!/usr/bin/perl -w
### Usage: hilite <ansi command> <target string>
### Purpose: Will read text from standard input and perform specified highlighting
### command before displaying text to standard output.
### License: GNU GPL
# unknown author 

$|=1; # don't buffer i/o
$command = "$ARGV[0]";
$target = "$ARGV[1]";
$color = "\e[" . $command . "m";
$end = "\e[0m";

while(<STDIN>) {
    s/($target)/$color$1$end/;
    print $_;
}

Dann kann ich es in Pipes verwenden, um die Protokollausgabe oder andere Dinge mit regexp / PCRE zu "hiliten":

 echo 'hello color world!!' | hilite.pl 34 "[Hh]el[^ ]*" | hilite.pl 43 .orld | hilite.pl 32 "\scolor\s"

Dies wird Hallo in Blau, Farbe in Grün und Welt in gelbem Hintergrund malen

Sie können die Farbliste mit sehen (Sie können den Bash-Ausdruck auf {01..255} erweitern, wenn Sie möchten):

for i in {01..10}  {30..49} {90..110}  ; do echo $i | hilite.pl $i $i ; done
Higuita
quelle
1

Es gibt eine viel elegantere Antwort als jede andere:

sudo apt-get install grc

(die auch installiert grcat)

Führen Sie nun Folgendes aus:

echo "[SEVERE] Service is down" | grcat ~/conf.username

Wo conf.myusernameenthält:

regexp=SEVERE
colours=on_red
count=more

(Aus irgendeinem Grund kann ich nicht den richtigen regulären Ausdruck für "alles zwischen Anführungszeichen" finden)

Sridhar Sarnobat
quelle