47 votes

Comment nettoyer la sortie de la commande linux 'script' ?

J'utilise la commande linux 'script'. http://www.linuxcommand.org/man_pages/script1.html pour suivre certaines sessions interactives. Les fichiers de sortie contiennent des caractères non imprimables, y compris mes frappes de retour arrière.

Existe-t-il un moyen de mettre de l'ordre dans ces fichiers de sortie afin qu'ils ne contiennent que ce qui a été affiché à l'écran ?

Ou existe-t-il un autre moyen d'enregistrer une session interactive Shell (entrée et sortie) ?

2voto

Tej Points 1

Si vous souhaitez é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

2voto

Aaron Points 21

Col -bp traite les espaces arrière comme souhaité (AFAIK). Mais cette commande ne tient pas compte des séquences d'échappement de la couleur. Il serait bon de supprimer d'abord les séquences de couleur, 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 plus de solutions pour y répondre. Il est extrêmement courant de script une session, puis quelqu'un a besoin de revoir la procédure. Vous voulez éliminer toutes les petites fautes 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. Il est préférable d'utiliser un texte ASCII simple. Je pense que c'est ce que l'on entend par "lisible par l'homme", et c'est une chose très raisonnable à faire.

1voto

Eponymous Points 111

https://github.com/RadixSeven/typescript2txt a été rédigé pour résoudre ce problème.

Cela fait 4 ans que je ne l'ai pas mis à jour/utilisé, mais je ne me souviens pas d'avoir fait quoi que ce soit d'extraordinaire qui ne devrait pas fonctionner encore aujourd'hui.

1voto

rynemccall Points 111

J'ai trouvé le réponse que dewtall a fournie à une question similaire sur le forum Unix pour être plus efficace dans la suppression des caractères de contrôle de la sortie de script si vous êtes dans un environnement où Perl est disponible.

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

0voto

justfortherec Points 125

Une autre solution consiste à utiliser strings qui n'imprime que les caractères imprimables d'un fichier (ou de l'entrée standard) :

strings -n 1 filename

Les -n 1 fixe à un la longueur minimale des séquences à préserver et garantit ainsi que même les caractères imprimables simples entourés de caractères non imprimables sont préservés.

L'inconvénient de cette approche est que strings ajoute des sauts de ligne entre des chaînes contiguës de caractères imprimables. Par exemple, un fichier dont le contenu est

Foo<SOMECONTROLCHAR>Bar

(où <SOMECONTROLCHAR> est un caractère de contrôle ou tout autre caractère non imprimable) serait renvoyée sous la forme de

Foo
Bar

Un autre problème soulevé dans les commentaires est que certaines séquences de caractères de contrôle sont constituées d'une combinaison de caractères imprimables et non imprimables et que cette approche ne supprimerait qu'une partie d'entre eux.

Cependant, strings permet de supprimer les caractères de contrôle tels que l'espacement arrière mentionné dans la question.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X