Ich verwende den Linux-Befehl 'script' http://www.linuxcommand.org/man_pages/script1.html , um einige interaktive Sitzungen zu verfolgen. Die Ausgabedateien davon enthalten nicht druckbare Zeichen, einschließlich meiner Rücktastenanschläge.
Gibt es eine Möglichkeit, diese Ausgabedateien aufzuräumen, sodass sie nur das enthalten, was auf dem Bildschirm angezeigt wurde?
Oder gibt es eine andere Möglichkeit, eine interaktive Shell-Sitzung aufzuzeichnen (Eingabe und Ausgabe)?
Antworten:
Wenn Sie die Datei anzeigen möchten, können Sie die Ausgabe über senden
col -bp
. Dies interpretiert die Steuerzeichen. Wenn Sie möchten, können Sie dann weniger durchpfeifen.col
Verwenden Sie auf einigen Systemen stattdessen die folgende Syntax:quelle
col
würde ich keinen Dateinamen akzeptieren, also habe ich getancol -bp < typescript
und bekommen, was ich wollte.less -R
bietet sich eine bessere Leistung an, als zuerst durchzuleitencol -bp
.col -bp <typescript | less -R
wird die farbige Konsole nicht angezeigt. Mitless -R typescript
wird die farbige Konsole angezeigt!less
.Hier ist eine Interpretation der Zeichenfolgeneingabe für
perl
:s/pattern//g
bedeutet, dass eine Ersetzung für die gesamteg
Eingabezeichenfolge ausgeführt wird (die Option bedeutet, dass die gesamte Eingabe ausgeführt wird, anstatt bei der ersten Ersetzung anzuhalten)Hier ist eine Interpretation des Regex-Musters:
\e
Entspricht dem speziellen Steuerzeichen "Escape" (ASCII 0x1A)(
und)
sind der Anfang und das Ende einer Gruppe|
bedeutet, dass die Gruppe mit einem von N Mustern übereinstimmen kann. wo die N Muster sind[^\[\]]
oder\[.*?[a-zA-Z]
oder\].*?\a
[^\[\]]
meint[
und]
\[.*?[a-zA-Z]
meint[
dann eine non-greedy-Operation.*?
bis zum ersten Buchstaben aus\].*?\a
meint]
Nicht gierig" beginnt, und tippe dann.*?
auf das spezielle Steuerzeichen "Alarm (Glocke)".quelle
typescript
an einperl
Programm zurückgegeben, das bestimmte Steuerzeichen aus der Ausgabe entfernt, und anschließend die Ausgabe an den Unix-col
Befehl weitergeleitet, dessen-b
Option alle "Lösch" -Schlüsselartefakte im Transkript entfernt. Anschließend wird die Ausgabe in eine Textdatei umgeleitet.Für eine große Menge von
script
Ausgaben würde ich ein Perl-Skript iterativ zusammen hacken. Ansonsten Hand mit einem guten Editor bearbeiten.Es ist unwahrscheinlich, dass es eine automatisierte Methode gibt, mit der Steuerzeichen
script
auf eine Weise aus der Ausgabe entfernt werden können, die das reproduziert, was zu bestimmten wichtigen Zeitpunkten auf dem Bildschirm angezeigt wurde (z. B. wenn der Host auf das erste Zeichen einer Benutzereingabe gewartet hat ).Beispielsweise kann der Bildschirm leer sein, außer
Andrew $
wenn Sierm /*
zwölf Mal (weitaus mehr als erforderlich) die Rücktaste gedrückt haben und dann tippen , was am Ende auf dem Bildschirm angezeigt wird, hängt davon ab, welche Shell ausgeführt wurde und welche aktuellenstty
Einstellungen Sie vorgenommen haben ( Dies könnte sich während einer Sitzung ändern.) Und wahrscheinlich auch einige andere Faktoren.Das oben Gesagte gilt für jede automatisierte Methode zur kontinuierlichen Erfassung von Ein- und Ausgaben. Die Hauptalternative ist das Aufnehmen von "Screenshots" oder das Ausschneiden und Einfügen des Bildschirms zu geeigneten Zeiten während der Sitzung (was ich für Benutzerhandbücher, Notizen für ein Tagesprotokoll usw. mache).
quelle
Eine Antwort auf den zweiten Teil meiner Frage ist die Verwendung der Protokollierungsfunktion im Gnu-Bildschirm:
^A H
aus einer laufenden Bildschirmsitzung heraus. Die Dokumentation finden Sie unter http://www.gnu.org/software/screen/manual/screen.html#Loggingquelle
Ich habe verwendet,
cat filename
was Steuerzeichen entfernt :-)quelle
Wenn Sie Ihre Befehle aufzeichnen möchten (z. B. um sie später in ein Bash-Skript umzuwandeln), müssen Sie einen vernünftigen Hack ausführen
script(1)
und anschließend ausführenDanach
grep
sucht die Ausgabedatei (normalerweise "typescript") nach Zeilen, die mit einem "+" beginnen. Der reguläre Ausdruck^\+
macht den Trick.quelle
Wenn Sie die Ausgabe in eine Datei schreiben möchten:
Verwenden Sie den Befehl unix2dos, um Dateien in das Windows-Format zu konvertieren
quelle
col -bp verarbeitet die Backspaces wie gewünscht (AFAIK). Aber es verstümmelt die Farbfluchtsequenzen. Es kann sinnvoll sein, zuerst die Farbsequenzen zu entfernen und dann, falls möglich, die Backspaces zu verarbeiten.
Dies ist ein sehr häufiger Bedarf, und ich bin überrascht, dass es keine weiteren Lösungen dafür gibt. Es ist extrem üblich, eine Sitzung zu skripten, dann muss jemand das Verfahren überprüfen. Sie möchten all die kleinen Tippfehler beseitigen und Escape-Sequenzen einfärben, um ein "sauberes" Skript für den späteren Gebrauch zu erstellen. Einfacher ASCII-Text bevorzugt. Ich denke, dies ist das, was unter "lesbar für Menschen" zu verstehen ist, und es ist sehr vernünftig, dies zu tun.
quelle
Ich fand die Antwort, die Dewtall auf eine ähnliche Frage auf dem Unix-Board lieferte , effektiver beim Entfernen von Steuerzeichen aus der Skriptausgabe, wenn Sie sich in einer Umgebung befinden, in der Perl für Sie verfügbar ist.
Dewtalls Drehbuch:
So entfernen Sie die Steuerzeichen:
quelle
https://github.com/RadixSeven/typescript2txt wurde geschrieben, um dieses Problem zu lösen.
Es ist 4 Jahre her, dass ich es zuletzt aktualisiert / verwendet habe, aber ich erinnere mich nicht daran, etwas Besonderes getan zu haben, das heute noch nicht funktionieren sollte.
quelle
Ich habe einen guten Weg gefunden, das zu tun. Auf meinem System werden lange Ausgabezeilen mit "^ M" (Leerzeichen gefolgt von Wagenrücklauf) bestreut. Das "^ M" kann gut durch das Nullzeichen "^ @" ersetzt werden, das beim Einfügen der Datei überhaupt nicht angezeigt wird.
Ich nehme auch das Timing auf. Um die Datei also perfekt wiederzugeben, kann ich "^ M" nicht einfach mit den folgenden Befehlen vollständig entfernen (da die Skriptwiedergabe Byte zählt):
Ich führe meinen Skriptbefehl folgendermaßen aus:
Also, was ich danach mache, ist:
Bei der ersten Bearbeitung (vor der Wiedergabe) wird die Anzahl der Bytes in der Datei beibehalten. Bei der zweiten Bearbeitung (nach der Wiedergabe) werden Leerzeichen an zufälligen Stellen entfernt. (Beachten Sie, dass die Skriptwiedergabe standardmäßig nach der Eingabedatei "typescript" sucht, weshalb ich sie nach "timing" nicht angegeben habe.)
quelle
Auch dos2unix am Ausgang erledigt den Trick
quelle
Eine andere Lösung besteht darin,
strings
nur druckbare Zeichen aus einer Datei (oder aus der Standardeingabe) zu drucken:Mit dieser
-n 1
Option wird die Mindestlänge der zu erhaltenden Sequenzen auf eins festgelegt. Auf diese Weise wird sichergestellt, dass auch einzelne druckbare Zeichen, die von nicht druckbaren Zeichen umgeben sind, erhalten bleiben.Ein möglicher Nachteil dieses Ansatzes besteht darin, dass
strings
Zeilenumbrüche zwischen aufeinander folgenden Zeichenfolgen für druckbare Zeichen eingefügt werden. Zum Beispiel eine Datei mit Inhalt(wobei
<SOMECONTROLCHAR>
es sich um ein Steuerzeichen oder ein anderes nicht druckbares Zeichen handelt) wird als zurückgegebenEin weiteres Problem, das in den Kommentaren angesprochen wurde, besteht darin, dass einige Folgen von Steuerzeichen aus einer Kombination von druckbaren und nicht druckbaren Zeichen bestehen und dieser Ansatz nur einen Teil davon entfernen würde.
Es ist
strings
jedoch eine gute Aufgabe, Steuerzeichen wie die in der Frage erwähnte Rücktaste zu entfernen.quelle
strings
entfernt nicht alle nicht druckbaren Zeichen. Es identifiziert und druckt Sequenzen druckbarer Zeichen . Das ist nicht dasselbe.strings
nur Sequenzen mit einer Mindestlänge von 4 gedruckt. Ich habe meine Antwort korrigiert, indem ich die-n 1
Option hinzugefügt habe, die die Mindestlänge auf 1 setzt. Vielen Dank für den Hinweis.strings
der alle nicht druckbaren Zeichen entfernt wurden. Daher ist die Behauptung genauso falsch wie vor der Bearbeitung. Es ist auch offensichtlich kaputt, weil "einige Farbcodes" (und Kontrollcodes im Allgemeinen) oft aus druckbaren und nicht druckbaren Zeichen bestehen. Zum Beispiel, um eine Steuercodesequenz der Textfarbe ändern könnte ,ESC[01;52m
wennESC
die Escape - Zeichen (Byte - Wert 27) Single ist. Die Verwendung von,strings
wie Sie vorschlagen, würde[01;52m
in der Ausgabe verbleiben, was bedeutungslos ist.strings
Möglicherweise nicht die gleiche Aufgabe wie bei einigen anderen Antworten, aber meiner Meinung nach ist dies ein gültiger Ansatz, um das in der Frage beschriebene Problem zu lösen.