2009-02-04 12 views
6

Ich habe kürzlich einige Server-Protokolle mit tail -f gesucht und dachte, dass es viel einfacher wäre, einige Dinge zu sehen, wenn ich die Ausgabe formatieren könnte. Wirklich alles, was ich suche, ist eine Möglichkeit, bestimmte Wörter zu färben (bestimmt durch eine Regex), und vielleicht bestimmte Wörter zu entfernen (wiederum durch eine Regex bestimmt).Anwenden von Formatierung auf Unix-Shell

Ich knowthere's Programme, die Server-Protokolle in Echtzeit und was nicht visualisieren, aber ich bin mehr daran interessiert.

Antwort

11

Den Ausgang von tail -f in sed einstecken und in einige ANSI escape codes einfügen. Zum Beispiel wird im Folgenden alle Zahlen in rot einfärben (Farbe 31) und alle Zeichenfolgen in Anführungszeichen in leuchtendem Gelb (Farbe 93):

RED=`echo -en '\e[31m'` 
YELLOW=`echo -en '\e[93m'` 
RESET=`echo -en '\e[00m'` 
tail -f file | sed -E "s/([0-9]+)/$RED\1$RESET/g;s/(\"[^\"]*\")/$YELLOW\1$RESET/g" 
+0

ein Problem: die Option -E verursacht einen Fehler? – nickf

+0

Sie müssen -E mit -e ersetzen und alle Klammern entfernen. Tail -f-Datei | sed -e "s/\ ([0-9] + \)/$ ROT \ 1 $ RESET/g; s/\ (\" [^ \ "] * \" \)/$ GELB \ 1 $ RESET/g " – itsadok

+0

Das -e ist nicht unbedingt notwendig. -E ist eine Option, um erweiterte Regexps zu verwenden, so dass Sie nicht aus Klammern entkommen müssen, aber anscheinend ist -E nicht auf allen Versionen von sed verfügbar. –

5

Ich denke, was Sie suchen, ist eine Art von sed Skript, das die Wörter umgibt, die Sie mit ANSI Color Escape-Sequenzen auswählen. (hmm ... schau mal).

EDIT OK, bekam es:

Hier ein Beispiel ist "Hallo" in Dunkelrot zur Ausgabe:

echo -e "\033[31mHello\033[0m" 

Was geschieht? Zuerst verwende ich echo -e, so dass echo die Schrägstriche nicht in Bildschirm Schrägstriche konvertiert, sondern liest die Escape-Sequenz von \033 als ein einzelnes Escapezeichen. Dies ist eigentlich nur 33 in Oktal, das ist 27 (die Ordnungszahl für die ESC-Taste).

Also, was wirklich auf dem Bildschirm gesendet wird, ist so etwas wie:

<ESC>[32mHello<ESC>[0m 

Welches ist die ANSI-Display als 0m Hallo ‚und führen Sie dann den Befehl„erste 32m, Ausgabe tun Sie den Befehl‘interpretiert.

In diesem Fall bedeutet der Befehl 32m "setze die Vordergrundfarbe auf 2", und da Farbe # 2 dunkelrot ist, wird der "Stift", der vom Terminal verwendet wird, nun dunkelrot sein, was von diesem Punkt aus bedeutet Danach wird der gesamte Text angezeigt, der auf dem Bildschirm angezeigt wird k rot.

Wenn wir fertig sind mit der Ausgabe des Textes, der rot sein soll, möchten wir die Farben zurücksetzen, also rufen wir den Befehl 0m auf, der die Farben auf normal zurücksetzt.

Für eine Liste aller Escape-Codes, schauen Sie in [http://en.wikipedia.org/wiki/ANSI_escape_code Wikipedia] oder einfach google dafür.

Also alle Ihre sed Skript muss die Wörter, die Sie wählen, mit den Worten umgeben von den Farben zu ersetzen. Zum Beispiel das Wort „Februar“ in /var/log/messages zu ersetzen, gehen Sie wie folgt vor:

tail /var/log/messages | sed -e "s/Feb/\\o033[31m&\\o033[0m/" 

(Man könnte dies tatsächlich als root zu tun haben, zu lesen /var/log/messages)

Alles sed tat, war Suche nach dem Wort "Feb" und umgeben Sie es mit der gleichen Escape-Sequenz wie wir oben verwendet haben.

Man könnte es erweitern mehrere Wörter zu färben:

tail /var/log/messages | sed -e "s/\(Feb\|Mar\|Apr\)/\\o033[31m&\\o033[0m/g" 

welche Farbe "Februar" würde "Mar", "April" - jeweils in Dunkelrot.

Ich hoffe, dies gibt Ihnen eine Idee, wie Sie tun können, was Sie brauchen!

+0

danke für die detaillierte antwort! – nickf

3

Dank sowohl scraimer und Adam, kam ich mit ziemlich viel, was ich war nach, und ich dachte, dass ich es hier für jeden anderen teilen würde:

RED=`echo -en '\e[31m'` 
YELLOW=`echo -en '\e[93m'` 
RESET=`echo -en '\e[00m'` 

# line breaks here are just for formatting 
tail -f ~/access-logs/access.log | sed -e "[email protected]\([0-9\.]\+\) - - 
    \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \" 
    \(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".* 
    @\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \[email protected]" 

# here's the full line if you wanted to copy it 
# tail -f ~/access-logs/access.log | sed -e "[email protected]\([0-9\.]\+\) - - \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \"\(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".*@\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \[email protected]" 

Welche dieser dreht:

182.108.1.20 - - [04/Feb/2009:23:24:41 +1000] "GET /images/exam_room.jpg HTTP/1.0" 200 8559 "http://www.myserver.com/courses/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" 

In diese (aber mit etwas Farbe):

23:24:41 200 (182.108.1.20) 
GET /images/exam_room.jpg 
Bytes: 8559 
From: http://www.myserver.com/courses/ 
Verwandte Themen