Estoy usando el comando de Linux 'script' http://www.linuxcommand.org/man_pages/script1.html para rastrear algunas sesiones interactivas. Los archivos de salida que contienen caracteres no imprimibles, incluidas mis pulsaciones de tecla de retroceso.
¿Hay alguna forma de ordenar estos archivos de salida para que solo contengan lo que se muestra en la pantalla?
¿O hay otra forma de grabar una sesión de shell interactiva (entrada y salida)?
Respuestas:
Si desea ver el archivo, puede enviar la salida
col -bp
; Esto interpreta los caracteres de control. Entonces puedes pasar menos, si quieres.En algunos sistemas
col
no aceptaría un argumento de nombre de archivo, use esta sintaxis en su lugar:fuente
col
no aceptaría un nombre de archivo, así que lo hicecol -bp < typescript
y obtuve lo que quería.less -R
por sí mismo, proporciona una mejor salida que pasarcol -bp
primero.col -bp <typescript | less -R
no muestra la consola coloreada. ¡El usoless -R typescript
muestra la consola coloreada!less
.Aquí hay alguna interpretación de la entrada de cadena a
perl
:s/pattern//g
significa hacer una sustitución en toda lag
cadena de entrada (la opción significa hacer todo en lugar de detenerse en el primer sustituto)Aquí hay alguna interpretación del patrón regex:
\e
coincide con el carácter de control especial de "escape" (ASCII 0x1A)(
y)
son el principio y el final de un grupo|
significa que el grupo puede coincidir con uno de los N patrones. donde están los patrones N[^\[\]]
o\[.*?[a-zA-Z]
o\].*?\a
[^\[\]]
medio[
y]
\[.*?[a-zA-Z]
medio[
luego hacer una no codiciosa.*?
hasta el primer carácter alfa\].*?\a
medio]
haga coincidir una cadena que comience con y luego haga una acción no codiciosa.*?
hasta que toque el carácter de control especial llamado "el carácter de alerta (campana)"fuente
typescript
unperl
programa que elimina ciertos caracteres de control de la salida, luego canaliza la salida alcol
comando unix , cuya-b
opción elimina cualquier artefacto clave "eliminar" en la transcripción. Luego canaliza la salida a un archivo de texto.Para una gran cantidad de
script
resultados, piratearía un script perl juntos de forma iterativa. De lo contrario, edite a mano con un buen editor.Es poco probable que exista un método automatizado existente para eliminar los caracteres de control de la
script
salida de una manera que reproduzca lo que se mostró en la pantalla en ciertos momentos importantes (como cuando el host estaba esperando ese primer carácter de alguna entrada del usuario).Por ejemplo, la pantalla puede estar en blanco, excepto que
Andrew $
, si luego escribiórm /*
y presionó retroceso doce veces (mucho más de lo necesario), lo que se muestra en la pantalla al final de eso depende de qué shell se estaba ejecutando, cuáles son susstty
configuraciones actuales ( que podría cambiar a mitad de una sesión) y probablemente también otros factores.Lo anterior se aplica a cualquier método automatizado de captura continua de entrada y salida. La alternativa principal es tomar "capturas de pantalla" o cortar y pegar la pantalla en los momentos apropiados durante la sesión (que es lo que hago para las guías de usuario, notas para un registro diario, etc.).
fuente
Una respuesta a la segunda parte de mi pregunta es usar la función de registro en la pantalla gnu:
^A H
desde una sesión de pantalla en ejecución. La documentación está en http://www.gnu.org/software/screen/manual/screen.html#Loggingfuente
Utilicé lo
cat filename
que elimina los caracteres de control :-)fuente
Si lo que buscas es grabar tus comandos (por ejemplo, para luego convertirlos en un script bash), entonces debes ejecutar un hack razonable
script(1)
, luego dentro de él ejecutarLuego,
grep
el archivo de salida (generalmente "mecanografiado") busca líneas que comiencen con un "+". La expresión regular^\+
hará el truco.fuente
Si desea escribir la salida en un archivo:
use el comando unix2dos para convertir el archivo al formato de Windows si lo desea
fuente
col -bp procesa los espacios de retroceso según lo deseado (AFAIK). Pero destruye las secuencias de escape de color. Puede ser bueno eliminar primero las secuencias de color, luego procesar los espacios de retroceso, si es posible.
Esta es una necesidad muy común, y me sorprende que no haya más soluciones. Es extremadamente común escribir una sesión en un script, entonces alguien tiene la necesidad de revisar el procedimiento. Desea eliminar todos los pequeños errores de escritura y secuencias de escape de color para crear una secuencia de comandos "limpia" del procedimiento para referencia futura. Texto ASCII simple preferido. Creo que esto es lo que se entiende por "legible por humanos", y es algo muy razonable de hacer.
fuente
Encontré que la respuesta que dewtall proporcionó a una pregunta similar en el tablero de Unix es más efectiva para eliminar los caracteres de control de la salida del script si se encuentra en un entorno donde Perl está disponible para usted.
guión de dewtall:
Para eliminar los caracteres de control:
fuente
https://github.com/RadixSeven/typescript2txt se escribió para resolver este problema.
Han pasado 4 años desde la última vez que lo actualicé / usé, pero no recuerdo haber hecho nada elegante que todavía no debería funcionar hoy.
fuente
Encontré una buena manera de hacerlo. En mi sistema, las líneas de salida largas están salpicadas con "^ M" (espacio en blanco seguido de retorno de carro). La "^ M" se puede reemplazar muy bien con el carácter nulo "^ @", que no se muestra en absoluto cuando se captura el archivo.
También capturo el tiempo, así que para reproducir el archivo perfectamente, no puedo simplemente eliminar "^ M" completamente usando los comandos a continuación (porque scriptreplay cuenta bytes):
Ejecuto mi comando de script de esta manera:
Entonces, lo que hago después es:
La primera edición (antes de la reproducción) retiene el número de bytes en el archivo. La segunda edición (después de la repetición) elimina el espacio en blanco en lugares aleatorios. (Tenga en cuenta que, de forma predeterminada, scriptreplay busca el archivo de entrada llamado "typecript", por lo que no lo proporcioné después de "timing").
fuente
dos2unix en la salida también hará el truco
fuente
Otra solución es usar el
strings
que imprime solo caracteres imprimibles de un archivo (o de una entrada estándar):La
-n 1
opción establece la longitud mínima de las secuencias que se conservarán en una y, por lo tanto, garantiza que incluso los caracteres imprimibles individuales rodeados de caracteres no imprimibles se conserven.Una posible desventaja de este enfoque es que
strings
agrega saltos de línea entre cadenas contiguas de caracteres imprimibles. Por ejemplo, un archivo con contenido(donde
<SOMECONTROLCHAR>
está el carácter de control o cualquier otro carácter no imprimible) se devolvería comoOtra cuestión planteada en los comentarios es que algunas secuencias de caracteres de control consisten en una combinación de caracteres imprimibles y no imprimibles, y este enfoque solo eliminaría parte de ellos.
Sin embargo,
strings
hace un buen trabajo al eliminar caracteres de control como el retroceso mencionado en la pregunta.fuente
strings
no elimina todos los caracteres no imprimibles. Identifica e imprime secuencias de caracteres imprimibles . Eso no es lo mismo.strings
solo imprime secuencias de una longitud mínima de 4. He corregido mi respuesta agregando la-n 1
opción que establece la longitud mínima en 1. Gracias por señalar esto.strings
elimina todos los caracteres no imprimibles, por lo que sigue siendo incorrecta de la misma manera que antes de la edición. También está obviamente roto porque "algunos códigos de color" (y los códigos de control en general) a menudo consisten en caracteres imprimibles y no imprimibles. Por ejemplo, una secuencia de código de control para cambiar el color del texto podría serESC[01;52m
dóndeESC
está el carácter de escape único (valor de byte 27). Usarstrings
como sugiere dejaría[01;52m
en la salida, lo que no tiene sentido.strings
Puede que no haga el mismo trabajo que algunas de las otras respuestas, pero en mi humilde opinión, es un enfoque válido para resolver el problema descrito en la pregunta.