Speichern der Ausgabe eines Greps in eine Datei mit Farben

36

Ich muss das Ergebnis eines grep-Befehls in einer Datei speichern, möchte aber auch, dass die Ausgabedatei formatiert wird und die Farben wie im Terminal bleiben.

Gibt es eine Möglichkeit, das zu tun? Vielleicht grep in eine Art Auszeichnungssprache speichern? Wenn dies nicht möglich ist, gibt es ein anderes Tool, das diese Aufgabe ausführen kann?

Ich versuche, das Suchwort in der Ausgabedatei hervorzuheben, genau wie im Terminal.

Moha das allmächtige Kamel
quelle

Antworten:

42

Um das Markup beizubehalten, benötigen Sie mehr als nur eine Textdatei. Ich würde HTML-Ausgabe verwenden, um die Farben zu behalten.

  • Install aha ie to "konvertiert ANSI-Escape-Sequenzen eines Unix-Terminals in HTML-Code "

    sudo apt-get install aha
  • Speichern Sie dann Ihre grep(oder ls) Ausgabe wie folgt:

    ls --color=always | aha --black --title 'ls-with-colors' > ls-with-colors.html

    Optionen:

    --black param to set background as black color
    --title param to set the title for HTML page

Syntax Highlight zur Dateierweiterung über pygmentize

  • installieren pygmentize:

    sudo apt-get install python-pygments
  • Führen Sie dann diesen Befehl aus:

    pygmentize file.pl | grep -i --color=always version | aha --black > ls-with-colors.html

Bildbeschreibung hier eingeben

Sylvain Pineau
quelle
1
AHA!! , aha ist ein wirklich wundervolles Werkzeug, genau das, wonach ich gesucht habe, danke !!
Moha das allmächtige Kamel
2
@ Mhd.Tahawi: Ich habe meine Antwort so aktualisiert, dass Sie die Codefarben (in Ihrem Fall Perl) beibehalten können, aber pygmentizemit vielen anderen funktioniert.
Sylvain Pineau
10

Je nachdem, was Sie mit der Ausgabedatei tun möchten, können Sie einer normalen Textdatei Farben hinzufügen, da die Farben einfach aus einigen Sonderzeichen stammen. Grep scheint sie nicht drucken zu wollen, wenn Sie sie in eine Datei umleiten, daher müssen Sie sie erzwingen:

grep --color=always "stuff" input.txt > output.txt

Wenn Sie nun die Datei auf die Konsole drucken, wird sie mit den Farben gedruckt, da Bash diese Zeichen als "Diese Farbe verwenden" interpretiert.

cat output.txt

Wenn Sie es jedoch in einem Editor wie öffnen vim, erhalten Sie einige seltsame Zeichen. Zum Beispiel, wenn ich die Befehle verwende

echo "A sentence. A red sentence. Another sentence." \
  | grep --color=always "A red sentence" > output.txt

Die Ausgabe sieht richtig aus, wenn ich sie drucke, cataber wenn ich sie öffne, vimerhalte ich

A sentence. ^[[01;31m^[[KA red sentence^[[m^[[K. Another sentence.

Wenn Sie also einen Editor verwenden möchten, ist dies wahrscheinlich nicht das, was Sie möchten.

MasterOfBinary
quelle
Richtig !!, ich bekam diese seltsamen Symbole dazwischen und verstand nicht, was das sind.
Moha das allmächtige Kamel
Ich mag wirklich, wie einfach / effektiv Ihre Antwort ist. nur die Ausgabe Katze :). Das ist großartig für kurze Zeit (gerade gut genug für mich im Moment).
Trevor Boyd Smith
Detail: Es ist das Terminal (Emulator), nicht Bash, das die Farbfluchtsequenzen (auch als seltsame Zeichen bezeichnet) interpretiert .
Masterxilo
2

Wenn ich es richtig verstanden habe, möchten Sie eine Terminalausgabe in einer Textdatei speichern, oder? Aber Sie möchten, dass es mit Farben formatiert wird. Wenn das der Fall ist, sind hier meine Ideen:

Ausgabe automatisch markieren

Wie Sie wahrscheinlich wissen, kann eine Grep-Ausgabe nicht formatiert werden, da es sich um eine Textdatei handelt. Soweit ich weiß, können Sie das also nicht auf einfache Weise tun.

Trotzdem gibt es eine einfache Problemumgehung, die darin besteht, Ihrem Texteditor klar zu machen, welche Art von Datei geöffnet wird. Nehmen wir zum Beispiel an, Ihre grep-Ausgabe enthält einige bash-Komponenten, sodass die bash-Hervorhebungen für Sie funktionieren (dies sind übrigens oft die Farben, die Sie in einer farbigen Ausgabe im Terminal sehen). Der Trick besteht also darin, die Textausgabe in einer Datei mit der richtigen Erweiterung zu speichern. Anstatt etwas zu tun wie:

ls | grep something > output

Sie können für gehen

ls | grep something > output.sh

Dadurch erkennt gedit (oder ein beliebiger anständiger Texteditor) automatisch, dass es sich um Bash-Code handelt, und hebt ihn entsprechend hervor. Sie brauchen die Ausgabe nicht einzufärben, das Programm erledigt dies für Sie, wenn es den Typ des Codes erkennt, den es öffnet. Wenn Sie mit anderen Formaten arbeiten, passen Sie die Erweiterung einfach an das an, auf das Sie zugreifen möchten (z. B.> output.xml,> output.html,> output.py ... etc). Viel Glück! :)

Hervorheben einiger Wörter in der Ausgabedatei

Wenn ich es verstanden habe, möchten Sie die gesuchten Wörter hervorheben. Auch dies ist in einer Nur-Text-Datei nicht möglich, nur weil es sich um einen Nur-Text handelt. Sie können jedoch auf sehr einfache Weise ein Format hinzufügen, z. B. mit HTML-Codierung. Dadurch wird Ihre Ausgabe in einen HTML-Code umgewandelt. Wenn Sie ihn mit einem Programm öffnen, das HTML interpretieren kann (libreoffice writer, firefox und 10000 usw.), werden einige Wörter hervorgehoben.

Nehmen wir dazu an, dies ist Ihr grep, das nach html exportiert wurde:

ls | grep keytext > output.html

Und jetzt möchten Sie den Schlüsseltext in Ihrer Ausgabe hervorheben . Sie können sed verwenden , um es zu tun, wie:

sed -i 's/keytext/<font color="red">keytext<\/font>/g' output.html

Und violà, jetzt ist dein Schlüsseltext rot hervorgehoben.

Rho
quelle
1
nette Idee !!, aber ich suche keine Syntax-Hervorhebung. Sie wissen, wie grep das Suchwort mit einer anderen Farbe, normalerweise rot, färbt. Ich möchte das so halten, dass das Keyword in der Ausgabedatei auffällt.
Moha das allmächtige Kamel
ok, also greifst du etwas mit Farbe? wie ein HTML-Code? Wenn Sie Farbe in der Eingabe sehen, muss diese formatiert und daher irgendwo codiert werden, wie z. B. "fontcolor: red", richtig? In diesem Fall müssen Sie möglicherweise den Formatierungscode in Ihr grep aufnehmen. :)
Rho
ok, mit dem edit in der frage bekomme ich es hin. :) Welche Ausgabeerweiterung verwenden Sie?
Rho
Ich greife nach einem Perl-Code, als ich die Perl-Erweiterung verwendet habe, habe ich eine vollständige Syntax-Färbung erhalten und ich greife nach einem Variablennamen, sodass er nicht einmal gefärbt war.
Moha das allmächtige Kamel