Der Tausendsassa Grcat steuert Programme über eine einheitliche Schnittstelle an, um deren Ausgabe nach Wunsch einzufärben. Das klappt selbst bei Software, die von sich aus keine Farbe unterstützt.
Verschiedene Textdateien miteinander zu vergleichen und die Veränderungen zwischen den jeweiligen Versionen nachzuvollziehen setzt Können im Umgang mit den Diff-Werkzeugen voraus. In Teil 1 dieser Serie legten wir daher den Blickwinkel zunächst auf einfache Standard-Differ [1] und stellten deren unterschiedliche Ausgabeformate mit und ohne farbliche Hervorhebung der Unterschiede vor. In Teil 2 besprachen wir Werkzeuge für spezielle, strukturierte Textformate [2]. Mit deren Hilfe gelingt es leichter, Unterschiede etwa in CSV-, XML- und JSON-Daten zu entdecken.
Dabei trat klar zutage, dass die Werkzeuge für identische Aufgaben unterschiedlichste Parameter erfordern, diese aber nicht konsistent benennen – hier kocht fast jedes Tool sein eigenes Süppchen. Zudem bieten nicht alle Werkzeuge eine farbige Ausgabe an. An dieser Stelle kommt das Werkzeug Generic Colouriser (Grcat [3]) mit seinem Frontend Grc ins Spiel. Grc assistiert dabei lediglich Grcat, das dann die eigentliche Arbeit erledigt.
Das Duo ist nicht neu, sondern mittlerweile volljährig – die erste Veröffentlichung geht auf das Jahr 1999 zurück. Seitdem gehört es als fester Bestandteil zu Debian GNU/Linux. Es zählt zu den weniger bekannten Helfern, die ohne viel Aufhebens ihren Job erledigen, und gehört längst zur Riege der Standardwerkzeuge, die jeder Benutzer kennen sollte.
Motivation
Es stellt sich die Frage, in welchem Kontext Grcat den größten Nutzen bringt. Können die üblichen Differ nicht bereits alles, was man im Alltag braucht? Oder andersherum: Was leistet Grcat, was andere Tools nicht oder nur sehr umständlich ermöglichen?
Die Ausgangssituation für die Entwicklung von Grcat ist typisch für das Unix-Linux-Universum und dessen Vielfalt. Der Autor Radovan Garabík erzählt, er habe sich überflutet gesehen von einer Vielzahl unterschiedlicher Werkzeuge zum Einfärben von Ausgaben mithilfe von ANSI-Farbcodes. Das war für ihn der Anlass, einen Wrapper um diverse Diff-Tools zu entwickeln, um diese Vielfalt bändigen und nutzen zu können, ohne sich dabei alle Parameter einprägen zu müssen.
Sein Gesamtpaket besteht wie schon geschildert aus zwei Werkzeugen – Grc und Grcat. Dabei nimmt Grc das zu unterstützende Programm samt Parameter entgegen und sendet dessen Ausgabe auf Stdout. Grcat, über eine Pipe an Grc angebunden, liest seinerseits von Stdin. Danach färbt es die erhaltene Ausgabe anhand von hinterlegten Färberegeln ein und schreibt das Ergebnis zurück auf Stdout.
Beide Werkzeuge kennen die Parameter bekannter (Diff-)Tools sowie deren Ausgabeformate. Sie übersetzen ihren Aufruf passend für das jeweilige Werkzeug und sorgen für eine farbige Ausgabe – sogar, wenn das unterstützte Programm das von sich aus gar nicht anbietet. Dafür greift Grcat auf eine Liste mit Mustern und den zugehörigen Regeln für das Einfärben zurück. Diese Kombination macht es für den Alltagsgebrauch und bei der Recherche in Dateien so interessant und bringt zusätzliche Farbe ins Terminal.
Das in Python als Wrapper geschriebene Grc/Grcat packen Sie als Wrapper um jedes beliebige andere Kommandozeilenprogramm. Statt nun etwa den Befehl diff FileA FileB direkt aufzurufen, benutzen Sie das Kommando als Übergabeparameter für Grc. Sie tippen also grc diff FileA FileB. Als Resultat erhalten Sie eine passend eingefärbte Ausgabe. Abbildung 1 stellt zwei Aufrufe von diff -u für die beiden Dateien regionen1 und regionen2 gegenüber – oben direkt, darunter mit Grc.
Konfiguration
Wie schon erwähnt, verwendet Grc/Grcat zwei Steuerkanäle – zum einen die Konfigurationsdateien mit den Färberegeln für diverse Programme, zum anderen Aufrufparameter. Die Konfiguration finden Sie in Ihrem Home-Verzeichnis unter ~/.grc/ oder unter /usr/local/share/grc/ beziehungsweise /usr/share/grc/. Grcat durchsucht die drei Ordner in dieser Reihenfolge, was garantiert, dass Ihre selbst erstellten Ergänzungen zu Färberegeln vorrangig Berücksichtigung finden.
Zunächst einmal muss Grcat das Programm identifizieren, dessen Ausgaben es einfärben soll. Dazu nutzt es eine in /etc/grc.conf abgelegte Liste. Jeder Eintrag darin besteht aus einem Kommentar, einem regulären Ausdruck zur korrekten Erkennung des Werkzeugs im Grc-Aufruf sowie dem Namen der Konfigurationsdatei mit den zugehörigen Färberegeln. Listing 1 zeigt einen Ausschnitt aus /etc/grc.conf für Ping, Traceroute sowie deren IPv6-Pendants. In der Tabelle “Färberegeln” sehen Sie die Regeln für die Werkzeuge, die Grcat derzeit mitbringt. Abbildung 2 demonstriert den Einsatz anhand der kolorierten Ausgabe eines Aufrufs von Lsblk.
Listing 1
grc.conf
# ping command (^|[/\w\.]+/)ping6?\s conf.ping # traceroute command (^|[/\w\.]+/)traceroute6?\s conf.traceroute
|
Kategorie |
Werkzeug |
|---|---|
|
Netzwerk |
Dig, Ifconfig, Ip, Ipaddr, Ipneighbor, Iproute, Iptables, Iwconfig, Ldap, Mtr, Netstat, Nmap, Ntpdate, Ping, Ping2, Proftpd, Ss, Tcpdump, Traceroute, Whois |
|
Entwicklung |
Ant, Configure, Cvs, Diff, Gcc, Wdiff |
|
Docker |
Docker-machine ls, Docker images, Docker info, Docker network, Docker ps, Docker pull, Docker search, Docker version |
|
Systemwerkzeuge |
Blkid, Df, Du, Env, Fdisk, Findmnt, Free, Getfacl, Getsebool, Id, Iostat, Jobs, Last, Ls, Lsattr, Lsblk, Lsmod, Lsof, Lspci, Mount, Ps, Pv, Sar, Semanage boolean, Semanage fcontext, Semanage user, Sensors, Showmount, Stat, Sysctl, Systemctl, Tune2fs, Ulimit, Uptime, Vmstat |
|
Paketverwaltung |
Dnf |
|
Sonstiges |
Esperanto, Irclog, Log, Lolcat, Mvn, Php, Sql |
Ein Regelblock in der Konfigurationsdatei beginnt in der Regel mit dem Präfix conf, gefolgt vom Namen des Werkzeugs. Er enthält Angaben zum Kolorieren eines bestimmten Eingabeformats. Dazu dienen die sieben Schlüsselworte regexp, colours, command, concat, skip, replace und count. Die Tabelle “Schlüsselworte” erklärt deren Bedeutung näher. Listing 2 zeigt den Inhalt der Grcat-Konfigurationsdatei für Diff.
|
Schlüsselwort |
Bedeutung |
|---|---|
|
|
Gewählte Farbe sowie Stil und Stärke der Schrift zur Ausgabe des Suchtreffers beziehungsweise der Zeile. |
|
|
Kommando, das Grc bei einem Suchtreffer ausführt. |
|
|
Name der Datei, an deren Inhalt Grc den Suchtreffer anfügen soll. |
|
|
Gibt an, ob Grc den Treffer nur einmal ( |
|
|
Regulärer Ausdruck zum Finden eines Suchtreffers. |
|
|
Ersetzt Suchtreffer durch den angegebenen Wert. |
|
|
Kann |
Listing 2
Färberegeln für Diff
# new lines and filenames (unified diff) regexp=^\+(.*$) colours=bold green count=more ======= # removed lines and filenames (unified diff) regexp=^\-(--.+$|[^\-].*$|$) colours=bold red count=more ======== # new lines regexp=^\>([^\>].*|$) colours=bold green count=more ======= # removed lines regexp=^\<([^\<].*|$) colours=bold red count=more ======= # lines affected regexp=^@@ .* @@$ colours=magenta count=more
Nützliche Aufrufparameter
Während die Konfiguration relativ komplex ausfällt, bleibt die Liste der Aufrufparameter von Grc eher übersichtlich. Das Tool versteht neben den üblichen Parametern wie --help und --version für die Hilfe und die Versionsangabe noch --colour. Die Angabe --colour=on aktiviert die Einfärbung (das Standardverhalten), --colour=off schaltet sie aus. Der Parameter --colour=auto beschränkt die Einfärbung auf Ausgaben in Terminals (tty). Grcat verfügt derzeit über keine Aufrufparameter.
Anwendungsbeispiel
Was Grcat leistet, zeigen am besten einige Beispiele aus dem Alltag. Es kann nicht nur den Output von Diff und Lsblk aufhübschen, sondern macht auch die Ausgaben von Ping (Abbildung 3) und Ip (Abbildung 4) ansehnlicher und leichter verständlich. Abbildung 5 kehrt zum Ausgangspunkt zurück und zeigt den Aufruf von Wdiff für zwei Dateien. Grcat hebt die Unterschiede augenfällig farblich hervor, sodass sie sich leicht erkennen lassen.
Automatischer Einsatz
Ab der relativ neuen Version 1.12 bringen zumindest die Debian- und Ubuntu-Pakete von Grc in /etc/profile.d/ einen Code-Schnipsel mit, der in der Bash dafür sorgt, dass das Tool die Ausgaben der meisten unterstützten Programme vollkommen automatisch und ohne Ihr Zutun einfärbt. Grc 1.13 schaltet dieses Feature allerdings per Default ab, Sie müssen es gegebenenfalls in der Datei /etc/default/grc explizit aktivieren. Debian 11 “Bullseye” enthält jedoch keine der beiden Versionen, Ubuntu bringt das Feature erst ab Version 21.10 “Impish Indri” mit.
Für ältere Releases, wie zum Beispiel für Grc 1.11.3 in “Bullseye”, rüsten Sie dieses Verhalten jedoch relativ einfach nach. Dazu verwenden Sie die Kommandos aus Listing 3, die eine Umgebungsvariable sowie den Inhalt der Datei grc.sh an Ihre .bashrc anhängen. Soll die Einstellung einheitlich für alle Benutzer greifen, also insbesondere auch für Root, speichern Sie die Datei grc.sh stattdessen (mit Root-Rechten) im Verzeichnis /etc/profile.d/ ab und legen eine Datei /etc/default/grc mit dem Inhalt GRC_ALIASES=true an (Listing 4). Letzteres ist notwendig, da die aktuelle Version von grc.sh die Aliase standardmäßig nicht mehr aktiviert.
Listing 3
Autocolor nachrüsten (Benutzer)
$ echo GRC_ALIASES=true >> ~/.bashrc $ curl https://raw.githubusercontent.com/garabik/grc/master/grc.sh >> ~/.bashrc
Listing 4
Autocolor nachrüsten (systemweit)
# echo GRC_ALIASES=true >> /etc/default/grc # cd /etc/profile.d/ # wget https://raw.githubusercontent.com/garabik/grc/master/grc.sh
Allerdings führt der Workaround unter Umständen dazu, dass Aliase für Kommandos entstehen, die Grcat in der als Paket installierten Version noch gar nicht unterstützt. Im Test erwies sich das allerdings eher als Schönheitsfehler: Der Programmaufruf braucht minimal länger, das entsprechende Kommando bleibt schlicht farblos. Andere negative Effekte konnten wir nicht entdecken.
Nutzer der Z-Shell haben es einfacher: Im Grc-Paket von Debian und Ubuntu findet sich seit Jahren die Datei /etc/grc.zsh, die man nur noch in die eigene .zshrc einbinden muss (Listing 5).
Listing 5
Autocolor für Zsh
% echo 'if [[ -r /etc/grc.zsh ]]; then . /etc/grc.zsh; fi' >> ~/.zshrc
Allerdings funktionieren bei den hinzugefügten Aliasen (beziehungsweise je nach Version Shell-Funktionen) Programme, die sowohl einen interaktiven als auch einen nicht interaktiven Modus unterstützen, nur noch nicht interaktiv. Das fiel im Rahmen der Recherche zu diesem Artikel beim Tool Mtr (My Traceroute) auf [4]. Im Zweifelsfall greifen Sie einfach zu einem Texteditor und kürzen die Liste der mit Aliasen versehenen Kommandos.
Fazit
Das Dream Team Grcat/Grc zaubert Farbe in den CLI-Alltag. Es färbt nahezu alles ein, was Sie ihm vorsetzen. Bei Terminals mit sehr dunklem Hintergrund funktionieren allerdings nicht immer alle vom Entwickler gewählten Farben gut. Insbesondere eine dunkelblaue Ausgabe auf schwarzem Hintergrund fördert die Lesbarkeit nur mäßig. Fehlt ein Werkzeug oder möchten Sie eine Farbe hinzufügen beziehungsweise ändern, dann ergänzen oder aktualisieren Sie die Konfiguration des Tools. So bleiben keine Wünsche offen. (jlu)
Die Autoren
Frank Hofmann arbeitet zumeist von unterwegs aus als Entwickler, Trainer und Autor. Der Linux-Sysadmin und Netzwerksicherheitsspezialist Axel Beckert ist bei den Informatikdiensten der ETH Zürich tätig. Beide Autoren haben ein Standardwerk rund um das Debian-Paketmanagement verfasst.
Infos
-
Diff-Werkzeuge (Teil 1): Axel Beckert, Frank Hofmann, “Vive la différence!”, LU 11/2021, S. 44, https://www.linux-community.de/46767
-
Diff-Werkzeuge (Teil 2): Axel Beckert, Frank Hofmann, “Herausragend”, LU 12/2021, S. 38, https://www.linux-community.de/46768
-
Generic Colouriser: https://github.com/garabik/grc
-
Bug-Report: https://github.com/garabik/grc/issues/192









