2011-08-22 16 views
7

Estoy tratando de usar el comando script para grabar una sesión interactiva de shell para que pueda usarla para preparar la documentación.formato de salida del comando "guión" de Unix: eliminar retrocesos, saltos de línea y caracteres borrados?

de acuerdo con la página del manual:

Guión coloca todo en el archivo de registro, incluyendo saltos de línea y
retrocesos. Esto no es lo que el usuario ingenuo espera.

yo soy el usuario ingenuos (no suelen tener un grito en las páginas de manual, esto es bastante emocionante!), Y me gustaría para procesar la salida para que retrocesos, avances de línea y caracteres eliminados, etc. en se eliminan.

ejemplo, corro un guión sesión:

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 

Luego utilizo gato para leer el registro de la sesión:

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 

pero cuando se utiliza menos, veo evidencia de los caracteres no deseados que son invisibles usando 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) 

cuando uso gato, entiendo que no elimina los caracteres invisibles, simplemente no los representa de forma visible, como menos hace - por lo que si el tubo de salida de gato a un archivo, todavía tiene los caracteres no deseados.

el formato de salida que me gustaría es una copia de lo gatopantallas. ¡Gracias!

(disculpas si esto es un duplicado, a partir de "formato de salida de secuencia de comandos UNIX" devuelve un montón de resultados de ruido con respecto a la cuestión que nos ocupa!)

+3

+1 para "Soy el usuario ingenua". :-) –

Respuesta

4

El comando col hará algunos, pero no todos, de la filtrando lo que estás buscando (Parece que no reconoce las secuencias de control para negrita y subrayado, por ejemplo.)

Un enfoque que he usado en el pasado es (a) cambiar el indicador de mi shell para que no resalte (normalmente lo hace), y/o (b) configure $TERM en "dumb" para que varios comandos no intenten utilizar ciertas secuencias de control.

2

O puede utilizar el comando "más", que interpretará esos personajes y mostrar exactamente lo que ha escrito, recibido como salida, etc., como si se desplazara hacia atrás en su búfer.

+0

No funciona: '\ r' y'^H' quedan en los datos. – Salamandar

4

Resolví el problema ejecutando scriptreplay en una pantalla y volcando el buffer de desplazamiento hacia un archivo.

La siguiente secuencia de comandos de expect hace esto por usted.

Se ha probado para archivos de registro con hasta 250,000 líneas. En el directorio de trabajo necesita su secuencia de comandos, un archivo llamado "tiempo" con 10.000.000 de veces la línea "1 10" y el script. Necesito el nombre de su script como argumento de línea de comando, como ./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 

El archivo de tiempo se pueden generar

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