Befehl "Highlight"

11

Gibt es einen Befehl, mit dem bestimmte Zeichenfolgen in stdin einfach hervorgehoben werden können (mit Farben, fettem Text oder invertiertem Hintergrund), während die gesamte Zeichenfolge an stdout übergeben wird? Ich denke darüber nach , es zu bauen , aber ich würde es lieber nur verwenden, wenn es bereits existiert. Einige wünschenswerte Funktionen:

  1. Separate Markierungszeichenfolgen werden automatisch unterschiedlich hervorgehoben. Beispielsweise wird die erste Zeichenfolge ohne manuelle Konfiguration rot, die zweite grün und die dritte blau hervorgehoben .
  2. Erkennt Farbunterstützung und greift auf fett / invertiert / andere Hervorhebungsmethoden zurück, sofern diese verfügbar sind.
  3. Ermöglichen Sie den Abgleich von regulären Ausdrücken und Literalzeichenfolgen.
  4. Macht am besten etwas Kluges, wenn sich die Übereinstimmungen überschneiden, wie "foobar" und "barbar".
  5. Zwischen stdin und stdout wird nichts geändert, außer dass Farbcodes hinzugefügt werden.
l0b0
quelle
Ooo, gute Frage. Ich brauchte genau das und schrieb am Ende etwas, aber es waren nur farbcodierte feste Zeichenfolgen, es hatte keine der von Ihnen aufgelisteten Funktionen
Michael Mrozek
Anstatt ein neues Dienstprogramm zu schreiben, wäre es super, dies als Ergänzung zu grep selbst zu sehen.
Mattdm
1
Die richtige Unix-Philosophie wäre ein neues Dienstprogramm, das nicht nur von grep, sondern auch von anderen Streams durchgeleitet werden kann. Ich vermute, es gibt mindestens ein oder mehrere Perl-Module, die dies wahrscheinlich für Sie tun können ...
Shadur
1
@ Gilles: Diese Frage ist viel begrenzter. Das Lesen war einer der Gründe, warum ich diese Frage gestellt habe - nach einer allgemeineren und flexibleren Lösung zu fragen.
10.

Antworten:

4

Vielleicht Radovan Garabíks Generic Colouriser (grc) ? Es erwartet eine Konfigurationsdatei als Argument und arbeitet mit regulären Ausdrücken. Also nicht ganz ohne Konfiguration, aber Sie können Process Process Substitution ( <(list)) verwenden, also auf jeden Fall ohne manuelle Konfiguration :-)

artistoex
quelle
Um dies zu klären, ohne die Seite öffnen zu müssen (und durchsuchbar zu machen), "this one" == Generic Colouriser ; grc und grcat ... Danke, ich mag es.
Peter.O
grchat ein Hilfsskript : grcat. Hier ist ein Beispiel für das Färben aller Großbuchstaben in Rot. Schritt 1: Richten Sie die Konfigurationsdatei ein: printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps Schritt 2; Verwenden Sie es: echo Hello World | grcat red-caps... Die Manpage gibt 3 Konfigurationsverzeichnisse an, die durchsucht werden, und schlägt dann vor (?), Dass die Konfigurationsdatei ein absoluter Pfad sein kann, aber diese letzte Methode zum Finden der Konfigurationsdatei funktioniert nur mit relativen Pfaden für mich (grc Version 1.3)
Peter.O
5

Sed zur Rettung!

Sie können dies verbessern (da es wirklich benötigt wird), aber es funktioniert ziemlich gut.

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF

Der Einfachheit halber akzeptiert hilight zwei Argumente (erstens die Übereinstimmung, zweitens die Farbe). In diesem Skript ist das Attribut immer fett gedruckt

Lesen Sie man console_codes (Graphic Rendition), um zu sehen, wie Farben entkommen, oder versuchen Sie dies

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done

Die Verwendung dieser Funktion hat wichtige Nachteile:

$ dmesg | hilight \\[ 34 ] 34

aber das überhaupt nicht:

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31

weil [: digit:] die Zahlen in den Escape-Abschnitten früherer Unterstützungen findet.

Etwas wie:

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33

funktioniert immer wie ausgenommen.

Mit dem Zeitbefehl habe ich festgestellt, dass dieses Inkrement die verstrichene Zeit um vier erhöht, was nicht zu viel ist.

Sie können den Befehl sed durch einen anderen Parser ersetzen, den Sie mögen oder der Ihren Anforderungen entspricht (awk usw.)

Nenopera
quelle
2

Man kann egrep auch mit einem Muster verwenden, das mit jeder Zeile eines nicht druckbaren Zeichens übereinstimmt, wie z.

dmesg | egrep --color "swap|$"
Michal Sylwester
quelle
1

Clide funktioniert gut. Ich benutze es auf RHEL 6.2 aus dem EPEL-Repository

Golimar
quelle
+1 für ein sehr schönes Werkzeug. Leider sind nicht alle Funktionen gefragt.
10.
1

Wenn Ihre Version von grepmit Färbung geliefert wird, können Sie die Regexp-Änderung verwenden, damit grep den Text hervorhebt und auch mit jeder Zeile übereinstimmt, sodass nichts ausgeschlossen wird. Folgendes sollte den Trick tun:

<your command> |grep "highlightme\|^"
EoghanM
quelle
0

Wie Sie im Link erwähnt haben, grep --color=alwaysfunktioniert nur für ein Muster. Trotzdem glaube ich nicht, dass es ein solches Werkzeug gibt.

Frederik Deweerdt
quelle
0

Ich benutze http://em.readthedocs.org/ . Einfache Installation auf verschiedenen Plattformen dank Python. Einfach und funktioniert gut.

ikalnitsky
quelle
Willkommen bei Unix & Linux Stack Exchange! Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
slm
1
Laut Hilfezentrum : "Sie müssen jedoch Ihre Zugehörigkeit in Ihren Antworten offenlegen." Falls Sie derselbe Igor Kalnitsky sind, der geschrieben hat em, formulieren Sie Ihre Antwort bitte neu, um klar zu stellen, dass Sie kein Benutzer, sondern der Autor des vorgeschlagenen Tools sind.
Manatwork