2011-08-22 10 views
7

Sto tentando di utilizzare il comando script per registrare una sessione shell interattiva in modo che possa essere utilizzata per preparare la documentazione.output di formato dal comando "script" di Unix: rimuovi backspaces, linefeed e caratteri cancellati?

secondo la pagina man:

Scrittura mette tutto nel file di registro, tra cui linefeeds e
backspace. Questo non è ciò che l'utente ingenuo si aspetta.

Io sono l'utente ingenuo (non di solito ricevono un grido in pagine man, questo è piuttosto eccitante!), E mi piacerebbe elaborare l'output in modo che backspace, linefeeds e caratteri cancellati e così vengono rimossi.

esempio, ho eseguito un sceneggiatura sessione:

stew:~> script -f scriptsession.log 
Script started, file is scriptsession.log 
stew:~> date 
Mon Aug 22 15:00:37 EDT 2011 
stew:~> #extra chars: that 
stew:~> exit 
exit 
Script done, file is scriptsession.log 

allora io uso gatto per leggere il registro di sessione:

stew:~> cat scriptsession.log 
Script started on 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 done on Mon 22 Aug 2011 03:01:01 PM EDT 

ma quando uso meno, vedo prova dei caratteri indesiderati che sono invisibili utilizzando cat:

stew:~> less scriptsession.log 
Script started on 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 done on Mon 22 Aug 2011 03:01:01 PM EDT 
scriptsession.log lines 1-8/8 (END) 

quando uso gatto, capisco che non rimuove i caratteri invisibili, semplicemente non li rappresenti visibilmente, come meno fa - quindi se il tubo del gatto uscita in un file, ha ancora i caratteri indesiderati.

il formato di output che vorrei è una copia di quello che gattodisplay. Grazie!

(scuse se questo è un duplicato, la ricerca "unix formato di output script" restituisce un sacco di risultati di rumore rispetto alla domanda a portata di mano!)

+3

+1 per "Io sono l'utente ingenuo". :-) –

risposta

4

Il comando col sarà fare un po ', ma non tutti, della filtro che stai cercando. (Non sembra riconoscere le sequenze di controllo per grassetto e sottolineatura, per esempio.)

Un approccio che ho usato in passato è quello di (a) cambiare il prompt della shell in modo che non faccia alcuna evidenziazione (normalmente) e/o (b) impostare $TERM su "dumb" in modo che i vari comandi non tentano di utilizzare determinate sequenze di controllo.

2

Oppure si può usare il comando "di più", che interpreterà i personaggi e visualizzare esattamente quello che avete digitato, ricevuti come output, ecc., come se si stesse scorrendo indietro nel buffer.

+0

Non funziona assolutamente: '\ r' e'^H' sono lasciati nei dati. – Salamandar

4

Ho risolto il problema eseguendo scriptreplay in una schermata e il dumping del buffer di scorrimento su un file.

Il seguente script di previsione lo fa per voi.

È stato testato per file di registro con un massimo di 250.000 linee. Nella directory di lavoro hai bisogno del tuo scriptlog, un file chiamato "time" con 10.000.000 di volte la riga "1 10" in esso, e lo script. Ho bisogno del nome del file di script come argomento della riga di comando, come ./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 

Il file di tempo può essere generato da

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