J'utilise la commande Linux 'script' http://www.linuxcommand.org/man_pages/script1.html pour suivre certaines sessions interactives. Les fichiers de sortie de ceux qui contiennent des caractères non imprimables, y compris les frappes de mon 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 interactive Shell (entrée et sortie)?
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 en faire moins, si vous le souhaitez.
col -bp TypeScript | less -R
Sur certains systèmes, col
n'accepte pas un argument de nom de fichier, utilisez plutôt cette syntaxe:
col -bp <TypeScript | less -R
cat TypeScript | Perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > TypeScript-processed
voici une interprétation de l'entrée de chaîne dans Perl
:
s/pattern//g
signifie effectuer une substitution sur la totalité de la chaîne d'entrée (l'option g
signifie faire la chose entière au lieu de s'arrêter sur la première substitution)voici une interprétation du motif regex:
\e
correspond 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 motifs N sont [^\[\]]
ou\[.*?[a-zA-Z]
ou\].*?\a
[^\[\]]
signifie [
et ]
\[.*?[a-zA-Z]
signifie [
puis faire un .*?
non-glouton jusqu'au premier caractère alpha\].*?\a
signifie ]
puis faites un .*?
non-glouton jusqu'à ce que vous frappiez le caractère de contrôle spécial appelé "le caractère d'alerte (sonnerie)"col-bp traite les espaces arrière à votre guise (autant que je sache). Mais cela altère les séquences d’échappement de couleur. Il serait peut-être bon de commencer par supprimer les séquences de couleurs, puis de traiter les backspaces, si possible.
C'est un besoin très courant et je suis surpris qu'il n'y ait pas plus de solutions à ce problème. Il est extrêmement courant de créer un script pour une session. Une personne doit alors revoir la procédure. Vous voulez supprimer toutes les petites erreurs de frappe et les séquences d'échappement couleur pour créer un script "propre" de la procédure pour référence future. Simple ASCII texte préféré. Je pense que c’est ce que l’intention veut de "lisible par l’homme" et c’est une chose très raisonnable à faire.
Pour une grande quantité de script
output, 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 permettant de supprimer les caractères de contrôle de la sortie de script
de manière à reproduire ce qui était affiché à l’écran à certains moments importants (par exemple, lorsque l’hôte l’attendait premier caractère d’une entrée utilisateur).
Par exemple, l'écran peut être vide, à l'exception de Andrew $
, si vous saisissez rm /*
et appuyez 12 fois de suite en arrière (beaucoup plus que nécessaire), ce qui s'affiche à l'écran à la fin de cette opération dépend du type de Shell en cours d'exécution, de votre nom actuel stty
name__. les paramètres sont (que vous pourriez changer en cours de session) et probablement aussi d’autres facteurs.
Ce qui précède s’applique à toute méthode automatisée de capture en continu des entrées et des sorties. La principale alternative est de prendre des "captures d'écran" ou de couper et coller l'écran à des moments appropriés de la session (ce que je fais pour les guides de l'utilisateur, les notes pour un journal quotidien, etc.).
Si vous voulez enregistrer vos commandes (par exemple, pour les transformer ultérieurement en script bash), un piratage raisonnable consiste à exécuter script(1)
, puis à l'intérieur
bash -x
Ensuite, grep
le fichier de sortie (généralement "TypeScript") recherchant des lignes commençant par un "+". L'expression régulière ^\+
fera l'affaire.
Une réponse à la deuxième partie de ma question consiste à utiliser la fonction de journalisation dans gnu screen: ^A H
à partir d'une session en cours d'exécution. La documentation est à http://www.gnu.org/software/screen/manual/screen.html#Logging
J'ai utilisé cat filename
qui supprime les caractères de contrôle :-)
Si vous voulez écrire la sortie dans un fichier:
col -bp < TypeScript >>newfile
utilisez la commande unix2dos pour convertir le fichier au format Windows si vous le souhaitez
https://github.com/RadixSeven/TypeScript2txt a été écrit pour résoudre ce problème.
Cela fait 4 ans que je l'ai utilisé/mis à jour pour la dernière fois, mais je ne me souviens pas d'avoir fait quelque chose d'extraordinaire qui ne devrait pas encore fonctionner aujourd'hui.
J'ai trouvé la réponse que dewtall fournissait à une question similaire sur le tableau 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:
#!/usr/bin/Perl
while (<>) {
s/ \e[ #%()*+\-.\/]. |
\r | # Remove extra carriage returns also
(?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
(?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
(?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
\e.|[\x80-\x9f] //xg;
1 while s/[^\b][\b]//g; # remove all non-backspace followed by backspace
print;
}
Pour supprimer les caractères de contrôle:
./dewtalls-script.pl < output-from-script-that-needs-control-characters-removed
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 chattez le fichier.
Je saisis également le minutage. Par conséquent, pour relire parfaitement le fichier, je ne peux pas simplement supprimer "^ M" à l’aide des commandes ci-dessous (car scriptreplay compte en octets):
tr '\r' '\0' | sed 's/ \x0//g'
Je lance ma commande de script comme ceci:
script -t -f session.log 2>timing
Donc, ce que je fais après c'est:
cat session.log | tr '\r' '\0' > TypeScript
scriptreplay -t timing | sed 's/ \x0//g'
La première édition (avant la relecture) conserve le nombre d'octets du fichier. La deuxième édition (après la relecture) supprime les espaces blancs de manière aléatoire. (Notez que par défaut scriptreplay recherche le fichier d'entrée nommé "TypeScript", c'est pourquoi je ne l'ai pas fourni après "timing".)