bash - crlf - formato de salida del comando "script" de Unix: eliminar espacios inversos, avances de lĂnea y caracteres borrados?
unix file format (4)
Intento utilizar el comando de script para grabar una sesión interactiva de shell para que pueda usarla para preparar la documentación.
de acuerdo con la página del manual:
Script coloca todo en el archivo de registro, incluidos los avances de línea y
Espalda. Esto no es lo que el usuario ingenuo espera.
Soy el usuario ingenuo (generalmente no recibo un saludo en las páginas man, ¡esto es bastante emocionante!), Y me gustaría procesar el resultado para que se eliminen los espacios posteriores, los saltos de línea y los caracteres eliminados, etc.
ejemplo, ejecuto una sesión de script :
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 uso cat 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 uso 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 cat , entiendo que no elimina los caracteres invisibles, simplemente no los representa visiblemente, como menos , por lo que si canalizo la salida de cat a un archivo, todavía tiene los caracteres no deseados.
el formato de salida que me gustaría es una copia de lo que muestra el gato . ¡Gracias!
(¡disculpen si se trata de un duplicado, al buscar "formato de salida de script de Unix" se obtienen muchos resultados de ruido con respecto a la pregunta en cuestión!)
Como lo menciona Keith, col
hace parte del trabajo (los personajes de control).
Puede utilizar ansifilter
para eliminar cualquier secuencia de escape ANSI que no desee: http://www.andre-simon.de/zip/download.html#ansifilter
El comando col
hará algunos, pero no todos, del filtrado que está buscando. (No parece reconocer las secuencias de control para negrita y subrayado, por ejemplo).
Un enfoque que he usado en el pasado es (a) cambiar el prompt de mi shell para que no resalte (normalmente lo hace), y / o (b) establecer $TERM
en "dumb"
para que se ganaran varios comandos '' Intentar usar ciertas secuencias de control.
O puede usar el comando "más", que interpretará esos caracteres y mostrará exactamente lo que escribió, recibió como salida, etc., como si hubiera retrocedido en el búfer.
scriptreplay
el problema ejecutando scriptreplay
en una pantalla y volcando el buffer de desplazamiento hacia un archivo.
La siguiente secuencia de comandos 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. ./name_of_script name_of_scriptlog
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 puede ser generado por
for i in $(seq 1 10000000); do echo "1 10" >> time; done