it-swarm.com.de

Entfernen von Steuerzeichen (einschließlich Konsolencodes / -farben) aus der Skriptausgabe

Ich kann den Befehl "script" verwenden, um eine interaktive Sitzung in der Befehlszeile aufzuzeichnen. Dies schließt jedoch alle Steuerzeichen nd Farbcodes ein. Ich kann Steuerzeichen (wie die Rücktaste) mit "col -b" entfernen, aber ich kann keinen einfachen Weg finden, um die Farbcodes zu entfernen.

Beachten Sie, dass ich die Befehlszeile auf normale Weise verwenden möchte, also Farben dort nicht deaktivieren möchte - ich möchte sie nur aus der Skriptausgabe entfernen. Ich weiß auch, dass ich herumspielen und versuchen kann, einen regulären Ausdruck zu finden, um Abhilfe zu schaffen, aber ich hoffe, dass es eine einfachere (und zuverlässigere - was ist, wenn es einen Code gibt, den ich bei der Entwicklung des regulären Ausdrucks nicht kenne?).

Um das Problem zu zeigen:

 Spl62 tmp: script 
 Skript gestartet, Datei ist TypeScript 
 Spl62 lepl: ls 
 Add-licence.sed build-example.sh Commit-Test Push-Docs .sh 
 add-licence.sh build.sh delete-licence.sed setup.py 
 asn build-test.sh delete-licence.sh src 
 build-doc.sh clean doc-src test.ini 
 spl62 lepl: exit 
 Skript fertig, Datei ist TypeScript 
 spl62 tmp: cat -v TypeScript 
 Skript gestartet am Do 09 Jun 2011 09:47:27 CLT 
 Spl62 lepl: ls ^ M 
 ^ [[0m ^ [[00madd-licence.sed ^ [[0m ^ [[00; 32mbuild-example.sh ^ [[0m ^ [[00mcommit-Test ^ [[0m ^ [[00; 32mpush-docs.sh ^ [[0m ^ M 
 ^ [[00; 32madd-licence.sh ^ [[0m ^ [[00; 32mbuild.sh ^ [[0m ^ [[00mdelete-licence.sed ^ [[0m ^ [[00msetup.py ^ [[0m ^ M 
 ^ [[01; 34masn ^ [[0m ^ [[00; 32mbuild-test.sh ^ [[0m ^ [[00; 32mdelete-licence.sh ^ [[0m ^ [[01; 34msrc ^ [[0m ^ M 
 ^ [[00; 32mbuild-doc.sh ^ [[0m ^ [[00; 32mclean ^ [[0m ^ [[01; 34mdoc-src ^ [[0m ^ [[00mtest.ini ^ [[0m ^ M 
 Spl62 lepl: exit ^ M 
 
 Skript erstellt am Do 09 Jun 2011 09:47:29 CLT 
 Spl62 tmp: col -b <TypeScript 
 Skript gestartet am Do 09 Jun 2011 09:47:27 CLT 
 Spl62 lepl: ls 
 0m00madd-licence.sed0m 00; 32mbuild-example.sh0m 00mcommit-test0m 00; 32mpush-docs.sh0m 
 00; 32madd-licence.sh0m 00; 32mbuild.sh0m 00mdelete-licence.sed0m 00msetup .py0m 
 01; 34masn0m 00; 32mbuild-test.sh0m 00; 32mdelete-licence.sh0m 01; 34msrc0m 
 00; 32mbuild-doc.sh0m 00; 32mclean0m 01; 34mdoc-src0m 00mtest.ini0m 
 Spl62 lepl: exit 
 
 Skript erstellt am Do 09 Jun 2011 09:47:29 CLT 
71
andrew cooke

Das folgende Skript sollte alle ANSI/VT100/xterm-Steuersequenzen für (basierend auf ctlseqs ) herausfiltern. Minimal getestet, melden Sie bitte eine Unter- oder Überübereinstimmung.

#!/usr/bin/env Perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \e\[ [ -?]* [@-~] | # CSI ... Cmd
       \e\] .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       \e[P^_] .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e. //xg;
    print;
}

Bekannte Probleme:

  • Beschwert sich nicht über fehlerhafte Sequenzen. Dafür ist dieses Skript nicht gedacht.
  • Mehrzeilige Zeichenfolgenargumente für DCS/PM/APC/OSC werden nicht unterstützt.
  • Bytes im Bereich von 128 bis 159 können als Steuerzeichen analysiert werden, obwohl dies selten verwendet wird. Hier ist eine Version, die Nicht-ASCII-Steuerzeichen analysiert (dies wird Nicht-ASCII-Text in einigen Codierungen, einschließlich UTF-8, entstellen).
#!/usr/bin/env Perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
    print;
}

Aktualisieren der Antwort von Gilles, um auch Wagenrückläufe zu entfernen und frühere Zeichen mit Rücktaste zu löschen, die beide für ein auf Cygwin generiertes TypeScript wichtig waren:

#!/usr/bin/Perl
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \r | # Remove extra carriage returns also
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
       1 while s/[^\b][\b]//g;  # remove all non-backspace followed by backspace
    print;
}
31
dewtell

Ich würde in diesem Fall sed verwenden.

tun:

cat -v TypeScript | sed -e "s/\x1b\[.\{1,5\}m//g"

sed -e "s/search/replace/g" ist Standard. Die Regex wird wie folgt erklärt:

\x1b stimme mit dem Escape vor dem Farbcode überein \[ entspricht der ersten offenen Klammer .\{1,5\} entspricht 1 bis 5 eines einzelnen Zeichens. Müssen, zu ... haben \ die geschweiften Klammern, um die Muschel davon abzuhalten, sie zu zerfleischen. m letztes Zeichen in Regex - folgt normalerweise dem Farbcode. // leere Zeichenfolge, durch die alles ersetzt werden soll. g stimmen mehrmals pro Zeile überein.

12
Glorytoad
cat TypeScript | Perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > TypeScript-processed
9
Peter Nore
# The "sed -r" trick does not work on every Linux, I still dunno why:
DECOLORIZE='eval sed "s,${END}\[[0-9;]*[m|K],,g"'

=> Verwendung :

<commands that type colored output> | ${DECOLORIZE}

getestet unter: - AIX 5.x/6.1/7.1 - Linux Mandrake/Mandriva/SLES/Fedora - SunOS

6
scavenger

Dort ist ein ansi2txt Befehl im colorized-logs Paket unter Ubuntu. ANSI-Farbcodes werden gut entfernt, es werden jedoch keine Fortschrittsbalken behandelt, die durch das Ausgeben von ^H oder ^M Zeichen zum Überschreiben von Text. col -b kann mit diesen umgehen, sodass Sie für optimale Ergebnisse beide kombinieren können

cat TypeScript | ansi2txt | col -b
5
Marius Gedminas

Ich habe das Problem gelöst, indem ich scriptreplay auf einem Bildschirm ausgeführt und den Scrollback-Puffer in eine Datei geschrieben habe.

Das folgende Expect-Skript erledigt dies für Sie.

Es wurde für Protokolldateien mit bis zu 250.000 Zeilen getestet. Im Arbeitsverzeichnis benötigen Sie Ihr Skriptprotokoll, eine Datei namens "time" mit dem 10.000.000-fachen der Zeile "1 10" und das Skript. Ich brauche den Namen Ihrer Skriptdatei als Befehlszeilenargument, wie ./name_of_script name_of_scriptlog.

#!/usr/bin/expect -f 

set logfile [lindex $argv 0]

if {$logfile == ""} {puts "Usage: ./script_to_readable.exp \$logfile."; exit}

set timestamp [clock format [clock sec] -format %Y-%m-%d,%H:%M:%S]
set pwd [exec pwd]
if {! [file exists ${pwd}/time]} {puts "ERROR: time file not found.\nYou need a file named time with 10.000.000 times the line \"1 10\" in the working directory for this script to work. Please provide it."; exit}
set wc [exec cat ${pwd}/$logfile | wc -l]
set height [ expr "$wc" + "100" ]
system cp $logfile ${logfile}.tmp
system echo $timestamp >> ${logfile}.tmp
set timeout -1
spawn screen -h $height -S $timestamp 
send "scriptreplay -t time -s ${logfile}.tmp 100000 2>/dev/null\r"
expect ${timestamp} 
send "\x01:hardcopy -h readablelog.${timestamp}\r"

send "exit\r"

system sed '/^$/d' readablelog.$timestamp >> readablelog2.$timestamp
system head -n-2 readablelog2.$timestamp >> ${logfile}.readable.$timestamp
system rm -f readablelog.$timestamp readablelog2.$timestamp ${logfile}.tmp

Die Zeitdatei kann von generiert werden

for i in $(seq 1 10000000); do echo "1 10" >> time; done
3
hnkchnsk

Ich würde es vorziehen, spezielle Tools zu verwenden, um die Skriptausgabe über benutzerdefinierten regulären Ausdruck in einfachen Text zu konvertieren, der ständig unterstützt und gut getestet wird. Das hat mir also geholfen:

$ cat TypeScript | ansi2txt | col -bp > TypeScript.txt.bp    
$ cat -v TypeScript.txt.bp

skriptbefehl erfasst in TypeScript-Datei ansi2txt - konvertiert Ansi-Code mit Escapezeichen wie Farbcodes, Backspaces usw. in regulären Text. Ich habe jedoch festgestellt, dass noch einige Escapezeichen übrig sind. col -bp - hat sie komplett entfernt.

Ich habe dies in der neuesten Ubuntu-Disco getestet und es funktioniert.

1
Dmytro Brazhnyk

Ich fand, dass nur die Verwendung von cat alles war, was ich brauchte, um die Ausgabe von script im Terminal anzuzeigen. Dies hilft nicht, wenn die Ausgabe in eine andere Datei umgeleitet wird, macht das Ergebnis jedoch im Gegensatz zu cat -v, col -b Oder einem Texteditor lesbar.

Um Farben zu entfernen oder die Ergebnisse in einer Datei zu speichern, kopieren Sie die Ausgabe von cat manuell und fügen Sie sie in einen Texteditor oder in einen anderen cat -Befehl ein, d. H.:

cat > endResult << END
<paste_copied_text_here>
END
1
Roger Dueck

Ich habe diese Frage gefunden, als ich nach einer Lösung für dasselbe Problem gesucht habe. Ein bisschen mehr graben und fand dieses Skript bei Live Journal unter diesem Link. Ich habe perfekt für mich gearbeitet. Es ist auch eine sehr gute Beschreibung dieses Problems und der Funktionsweise der Lösung. Auf jeden Fall eine Lektüre wert. http://jdimpson.livejournal.com/7040.html

#!/usr/bin/Perl -wp

# clean up control characters and other non-text detritus that shows up 
# when you run the "script" command.

BEGIN {
# xterm titlebar escape sequence
$xtermesc = "\x1b\x5d\x30\x3b";

# the occurence of a backspace event (e.g. cntrl H, cntrol W, or cntrl U)
$backspaceevent = "\x1b\\\x5b\x4b"; # note escaping of third character

# ANSI color escape sequence
$ansiesc = qr/\x1b\[[\d;]*?m/;

# technically, this is arrow-right. For some reason, being used against
# very long backspace jobs. I don't fully understand this, as evidenced
# by the fact that is off by one sometimes.
$bizarrebs = qr/\x1b\[C/;

# used as part of the xterm titlebar mechanism, or when
# a bell sounds, which might happen when you backspace too much.
$bell = "\x07"; # could use \a

$cr = "\x0d"; # could use \r

$backspace = "\x08"; # could use \b
}

s/$xtermesc.+?$bell//g;
s/[$cr$bell]//g;
s/${backspaceevent}//g;
s/$ansiesc//g;
while (s/(.)(?=$backspace)//) { s/$backspace//; } # frickin' sweet 
# For every ^H delete the character immediately left of it, then delete the ^H.
# Perl's RE's aren't R, so I wonder if I could do this in one expression.
while (s/(..)(?=$bizarrebs)//) { s/$bizarrebs//; }
1
SammerV

Die bisher angegebenen Lösungen funktionieren zwar gut, um die Steuersequenzen zu entfernen, sie entfernen jedoch auch die Formatierungscodes. Das Ergebnis ist, dass die Tabellen in der Ausgabe zusammengedrückt werden. Meine Anforderung bestand nur darin, die vom Terminal gesammelten Sitzungsprotokolldateien anzeigen und durchsuchen zu können. Die Lösung, die für mich am besten funktioniert, war die Verwendung von weniger -r.

less -r session.log
0
AliA