9 Stimmen

Formatiere die Ausgabe des Unix "Script"-Befehls: Entferne Backspaces, Zeilenumbrüche und gelöschte Zeichen?

Ich versuche, das script Befehl zu verwenden, um eine interaktive Shell-Sitzung aufzuzeichnen, damit ich sie zur Vorbereitung von Dokumentationen verwenden kann.

Laut der Man-Seite:

Script platziert alles in der Protokolldatei, einschließlich Zeilenumbrüche und
Rückstellungen. Das ist nicht das, was der unerfahrene Benutzer erwartet.

Ich bin der unerfahrene Benutzer (bekomme normalerweise keinen Hinweis in Handbüchern, das ist ziemlich aufregend!), und ich möchte die Ausgabe verarbeiten, damit Rückstellungen, Zeilenumbrüche und gelöschte Zeichen usw. entfernt werden.

Beispiel, ich führe eine script Sitzung aus:

stew:~> script -f scriptsession.log
Script gestartet, Datei ist scriptsession.log
stew:~> date
Mon Aug 22 15:00:37 EDT 2011
stew:~> #extra chars: that
stew:~> exit
exit
Script beendet, Datei ist scriptsession.log

dann benutze ich cat, um das Sitzungsprotokoll zu lesen:

stew:~> cat scriptsession.log
Script gestartet am Mon 22 Aug 2011 03:00:35 PM EDT
stew:~> date
Mon Aug 22 15:00:37 EDT 2011
stew:~> #extra chars: that
stew:~> exit
exit
Script beendet am Mon 22 Aug 2011 03:01:01 PM EDT

aber wenn ich less benutze, sehe ich Beweise für die unerwünschten Zeichen, die mit cat unsichtbar sind:

stew:~> less scriptsession.log
Script gestartet am Mon 22 Aug 2011 03:00:35 PM EDT
stew:~> date
Mon Aug 22 15:00:37 EDT 2011
stew:~> #extra chars: thiESC[ESC[ESC[ESC[Kthat
stew:~> exit
exit
Script beendet am Mon 22 Aug 2011 03:01:01 PM EDT
scriptsession.log Zeilen 1-8/8 (ENDE)

Wenn ich cat benutze, verstehe ich, dass es die unsichtbaren Zeichen nicht entfernt, es stellt sie einfach nicht sichtbar dar, wie es less tut - also, wenn ich die Ausgabe von cat in eine Datei umleite, enthält sie immer noch die unerwünschten Zeichen.

Das Ausgabeformat, das ich möchte, ist eine Kopie dessen, was cat anzeigt. Danke!

(Entschuldigung, wenn dies ein Duplikat ist, die Suche nach "Unix-Skript-Ausgabeformat" liefert viele falsche Ergebnisse in Bezug auf die vorliegende Frage!)

4voto

Keith Thompson Punkte 240701

Der col Befehl erledigt einige, aber nicht alle Filterfunktionen, die Sie suchen. (Er scheint beispielsweise die Steuerzeichen für fett gedruckt und unterstrichen nicht zu erkennen.)

Ein Ansatz, den ich in der Vergangenheit verwendet habe, besteht darin, (a) mein Shell-Prompt so zu ändern, dass es keine Hervorhebungen durchführt (normalerweise macht es das), und/oder (b) $TERM auf "dumb" zu setzen, damit verschiedene Befehle bestimmte Steuerzeichen nicht verwenden.

4voto

hnkchnsk Punkte 56

Ich habe das Problem gelöst, indem ich scriptreplay in einem Screen ausgeführt habe und den Bildlaufpuffer in eine Datei geschrieben habe.

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

Es wurde für Logdateien mit bis zu 250.000 Zeilen getestet. Im Arbeitsverzeichnis benötigen Sie Ihr Skriptprotokoll, eine Datei mit dem Namen "time", die 10.000.000 Mal die Zeile "1 10" enthält, sowie das Skript. Es benötigt den Namen Ihrer Skriptdatei als Befehlszeilenargument, z.B. ./name_of_script name_of_scriptlog.

#!/usr/bin/expect -f 

set logfile [lindex $argv 0]

if {$logfile == ""} {puts "Verwendung: ./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 "FEHLER: Zeitdatei nicht gefunden.\nEs wird eine Datei mit dem Namen time mit 10.000.000 Mal der Zeile \"1 10\" im Arbeitsverzeichnis benötigt, damit dieses Skript funktioniert. Bitte stellen Sie diese bereit."; 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 generiert werden durch

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

2voto

sehe Punkte 346808

Wie von Keith erwähnt, erledigt col einen Teil der Arbeit (die Steuerzeichen).

Sie können außerdem ansifilter verwenden, um alle ANSI-Escape-Sequenzen zu entfernen, die Sie nicht möchten: http://www.andre-simon.de/zip/download.html#ansifilter

2voto

jth Punkte 140

Oder Sie können den Befehl "more" verwenden, der diese Zeichen interpretiert und genau das anzeigt, was Sie eingegeben haben, empfangen als Ausgabe, usw, als ob Sie in Ihrem Puffer zurückgescrollt hätten.

0voto

Sergei Petrov Punkte 1
# awk Skript
{
    gsub(/\033\[[CK]/, "")
    while (sub(/.\b/, "")) ;
    print
}

Das Skript entfernt die sich abwechselnden 'ESC [ C' und 'ESC [ K' Teilstrings. Ersetzt dann 'c BS' Teilstrings durch nichts, wobei c für jedes Zeichen steht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X