J'utilise la commande linux 'script' http://www.linuxcommand.org/man_pages/script1.html pour suivre certaines sessions interactives. Les fichiers de sortie qui contiennent des caractères non imprimables, y compris mes frappes de retour arrière.
Existe-t-il un moyen de ranger ces fichiers de sortie afin qu'ils ne contiennent que ce qui était affiché à l'écran?
Ou existe-t-il un autre moyen d'enregistrer une session shell interactive (entrée et sortie)?
Réponses:
Si vous souhaitez afficher le fichier, vous pouvez envoyer la sortie via
col -bp
; cela interprète les caractères de contrôle. Ensuite, vous pouvez passer moins, si vous le souhaitez.Sur certains systèmes
col
n'accepteraient pas un argument de nom de fichier, utilisez plutôt cette syntaxe:la source
col
n'accepterait pas un nom de fichier, alors je l'ai faitcol -bp < typescript
et j'ai obtenu ce que je voulais.less -R
en lui-même, il fournit un meilleur rendement que la tuyauterie encol -bp
premier.col -bp <typescript | less -R
n'affiche pas la console colorisée. L'utilisationless -R typescript
affiche la console colorisée!less
.voici une interprétation de la chaîne entrée
perl
:s/pattern//g
signifie faire une substitution sur la totalité (l'g
option signifie faire toute la chose au lieu de s'arrêter sur le premier substitut) chaîne d'entréevoici une interprétation du modèle d'expression régulière:
\e
correspondre au caractère de contrôle "d'échappement" spécial (ASCII 0x1A)(
et)
sont le début et la fin d'un groupe|
signifie que le groupe peut correspondre à l'un des N modèles. où les N modèles sont[^\[\]]
ou\[.*?[a-zA-Z]
ou\].*?\a
[^\[\]]
veux dire[
et]
\[.*?[a-zA-Z]
veux dire[
puis faire un non-gourmand.*?
jusqu'au premier caractère alpha\].*?\a
veux dire]
puis faire un non-gourmand.*?
jusqu'à ce que vous frappiez le caractère de contrôle spécial appelé "le caractère d'alerte (cloche)"la source
typescript
dans unperl
programme qui supprime certains caractères de contrôle de la sortie, puis redirige la sortie vers lacol
commande unix , dont l'-b
option supprime tous les artefacts de clé "supprimer" dans la transcription. Il dirige ensuite la sortie vers un fichier texte.Pour une grande quantité de
script
sortie, je piraterais un script perl ensemble de manière itérative. Sinon, éditez à la main avec un bon éditeur.Il est peu probable qu'il existe une méthode automatisée existante pour supprimer les caractères de contrôle de la
script
sortie d'une manière qui reproduit ce qui était affiché à l'écran à certains moments importants (comme lorsque l'hôte attendait le premier caractère d'une entrée utilisateur).Par exemple, l'écran peut être vide à l'exception de
Andrew $
, si vous avez ensuite tapérm /*
et appuyé douze fois en arrière (beaucoup plus que nécessaire), ce qui s'affiche à l'écran à la fin de cela dépend du shell en cours d'exécution, de vosstty
paramètres actuels ( que vous pourriez changer en cours de session) et probablement d'autres facteurs également.Ce qui précède s'applique à toute méthode automatisée de capture continue d'entrée et de sortie. L'alternative principale consiste à prendre des «captures d'écran» ou à couper et coller l'écran à des moments appropriés pendant la session (c'est ce que je fais pour les guides de l'utilisateur, les notes pour un journal de bord, etc.).
la source
Une réponse à la deuxième partie de ma question est d'utiliser la fonction de journalisation dans l'écran gnu: à
^A H
partir d'une session d'écran en cours d'exécution. La documentation est à http://www.gnu.org/software/screen/manual/screen.html#Loggingla source
J'ai utilisé
cat filename
ce qui supprime les caractères de contrôle :-)la source
Si ce que vous cherchez est d'enregistrer vos commandes (par exemple pour les transformer plus tard en un script bash), alors un hack raisonnable est à exécuter
script(1)
, puis à l'intérieurEnsuite,
grep
le fichier de sortie (généralement "dactylographié") recherchant des lignes commençant par un "+". L'expression régulière^\+
fera l'affaire.la source
Si vous souhaitez écrire la sortie dans un fichier:
utilisez la commande unix2dos pour convertir le fichier au format Windows si vous le souhaitez
la source
col -bp traite les espaces arrière comme souhaité (AFAIK). Mais cela réduit les séquences d'échappement de couleur. Il peut être judicieux de supprimer d'abord les séquences de couleurs, puis de traiter les espaces arrière, si possible.
Il s'agit d'un besoin très courant et je suis surpris qu'il n'y ait pas d'autres solutions. Il est extrêmement courant de scénariser une session, alors quelqu'un a besoin de revoir la procédure. Vous voulez supprimer toutes les petites erreurs de frappe et les séquences d'échappement de couleur pour créer un script "propre" de la procédure pour référence future. Texte ASCII simple préféré. Je pense que c'est ce que veut dire "lisible par l'homme", et c'est une chose très raisonnable à faire.
la source
J'ai trouvé que la réponse fournie par dewtall à une question similaire sur la carte Unix était plus efficace pour supprimer les caractères de contrôle de la sortie du script si vous êtes dans un environnement où Perl est à votre disposition.
le script de dewtall:
Pour supprimer les caractères de contrôle:
la source
https://github.com/RadixSeven/typescript2txt a été écrit pour résoudre ce problème.
Cela fait 4 ans que je l'ai mis à jour / utilisé pour la dernière fois, mais je ne me souviens pas avoir fait quelque chose d'extraordinaire qui ne devrait pas encore fonctionner aujourd'hui.
la source
J'ai trouvé un bon moyen de le faire. Sur mon système, les longues lignes de sortie sont saupoudrées de "^ M" (espace vide suivi d'un retour chariot). Le "^ M" peut être joliment remplacé par le caractère nul "^ @", qui ne s'affiche pas du tout lorsque vous cat le fichier.
Je capture également le timing, donc pour pouvoir rejouer le fichier parfaitement, je ne peux pas simplement supprimer complètement "^ M" en utilisant les commandes ci-dessous (car scripttreplay compte des octets):
J'exécute ma commande de script comme ceci:
Donc, ce que je fais après, c'est:
La première édition (avant la relecture) conserve le nombre d'octets dans le fichier. Le deuxième montage (après la relecture) supprime les espaces blancs à des endroits aléatoires. (Notez que par défaut, scripttreplay recherche le fichier d'entrée nommé "typescript", c'est pourquoi je ne l'ai pas fourni après "timing".)
la source
dos2unix sur la sortie fera aussi l'affaire
la source
Une autre solution consiste à utiliser
strings
qui imprime uniquement des caractères imprimables à partir d'un fichier (ou d'une entrée standard):L'
-n 1
option définit la longueur minimale des séquences à conserver à un et garantit ainsi que même les caractères imprimables simples entourés de caractères non imprimables sont préservés.Un inconvénient possible de cette approche est l'
strings
ajout de sauts de ligne entre les chaînes contiguës de caractères imprimables. Par exemple un fichier avec du contenu(où
<SOMECONTROLCHAR>
est le caractère de contrôle ou tout autre caractère non imprimable) serait retourné commeUn autre problème soulevé dans les commentaires est que certaines séquences de caractères de contrôle consistent en une combinaison de caractères imprimables et non imprimables et cette approche n'en supprimerait qu'une partie.
Cependant,
strings
fait un bon travail de suppression des caractères de contrôle comme le retour arrière mentionné dans la question.la source
strings
ne supprime pas tous les caractères non imprimables. Il identifie et imprime des séquences de caractères imprimables . Ce n'est pas la même chose.strings
imprime uniquement des séquences d'une longueur minimale de 4. J'ai corrigé ma réponse en ajoutant l'-n 1
option qui définit la longueur minimale à 1. Merci de l'avoir signalé.strings
supprime tous les caractères non imprimables, elle est donc toujours erronée de la même manière qu'elle était avant la modification. Il est aussi manifestement cassé parce que "certains codes couleur" (et les codes de contrôle en général) sont souvent composés de caractères imprimables et non imprimables. Par exemple, une séquence de codes de contrôle pour changer la couleur du texte peut êtreESC[01;52m
où seESC
trouve le caractère d'échappement unique (valeur d'octet 27). Utiliserstrings
comme vous le laisseriez[01;52m
dans la sortie, ce qui n'a aucun sens.strings
pourrait ne pas faire le même travail que certaines des autres réponses, mais à mon humble avis, c'est une approche valable pour résoudre le problème décrit dans la question.