Suppression des caractères d'échappement du journal d'écran de GNU Screen.% N

14

Est-il possible de supprimer les séquences ESC dans le fichier de sortie de GNU Screen? Des éléments tels que les couleurs, les tabulations et autres caractères d'échappement pénètrent dans les fichiers journaux et deviennent difficiles à déchiffrer.

J'ai essayé le Dr Google & Co. ainsi que la lecture du manuel, mais je n'ai rien trouvé de convenable ...

J'ai peut-être oublié quelque chose?

shaond
la source

Réponses:

11

Essayez ce morceau de magie Perl:

perl -ne 's/\x1b[[()=][;?0-9]*[0-9A-Za-z]?//g;s/\r//g;s/\007//g;print' < screenlog.0
whitequark
la source
Merci pour cela - c'est génial! Il contient toujours les caractères ^ G et ^ M, mais c'est beaucoup plus lisible ...
shaond
1
Ajouté à l'expression.
whitequark
Je me demande combien de visages ASCII sont dans cette doublure. J'ai arrêté de compter environ 20.
John T
4
Bien sûr, je peux écrire un autre one-liner qui les comptera.
whitequark
10

Utilisez ansifilter.

ansifilter screenlog.txt > screenlog.txt.clean
Jan
la source
est-ce quelque chose dans chaque système Linux ou quelque chose qui doit être installé?
Journeyman Geek
@JourneymanGeek ce n'est même pas dans les dépôts Ubuntu, donc je dirais que ce n'est pas exactement populaire. Il semble que vous devez l'obtenir vous-même à partir de la page du projet et exécuter / compiler vous-même. Je ne l'appellerais pas exactement un programme populaire ansifilter.sourceforge.net
Simon Sheehan
Je suis sur OSX et utilisé brew install ansifilteret cela a fonctionné comme un charme.
thekingoftruth
1
Je ne sais pas comment cela a changé depuis les commentaires de 2012 sur la distribution, mais je l'ai trouvé dans le dépôt de la version actuelle de Fedora (22).
dmh
10

Essayez également l'option -r ou -R de less.

less -r screenlog.0
dex
la source
Belle solution. Il traite correctement tous les caractères ^ H (supprimer), affiche les barres de progression sans le creux ^ M et conserve même mon invite de couleur! Bien sûr, parfois afficher un journal n'est pas suffisant.
Quantum7
5

Une fois que vous avez capturé votre session dans screenlog.n, vous pouvez envoyer le fichier au terminal, puis utiliser la commande de copie d'écran de l'écran pour vider la sortie du chat dans un fichier. Le résultat vous fournira une sortie propre qui n'a aucune séquence d'échappement.

Le seul «problème» semble être de s'assurer que la copie papier capture tout dans le tampon de défilement et que le tampon de défilement ne contient que ce que vous voulez capturer.

1. $ screen
2. $ cd /path/to/screenlog.n directory/
3. $ wc -l screenlog.n 
4. $ screen -X scrollback 245 # 245 is the number of lines found from your wc command + 5 
5. $ cat screenlog.n
6. $ screen -X hardcopy -h screenlog.n.cleaned 

Notez que -h garantit que vous capturez l'intégralité de l'historique de défilement et pas seulement ce qui est en vue immédiate

Le fichier screenlog.n.cleaned contiendra désormais une copie papier de la sortie cat et n'inclura aucune séquence d'échappement

Joel Verks
la source
Très très soigné . Tous les autres one-liner perl / sed / python ont échoué pour moi. Très frustrant en pensant que moins -r / plus traitaient directement mon fichier. Une suggestion wc -ln'a pas fonctionné pour moi. Il a renvoyé 28226, mais avait vraiment besoin de 33031 dans mon cas.
malat
4

J'utilise la stringscommande pour rendre un journal d'écran lisible. Sous Debian, il fait partie du paquet binutils.

Comme le dit sa page de manuel:

strings - recherchez les chaînes imprimables dans un objet ou un autre fichier binaire

blasio
la source
2

Si vous êtes un screenutilisateur, la solution de copie d'écran proposée par Joel Verks fonctionnera mieux - en supposant que vous ayez un grand défilement défini dans votre .screenrc:

defscrollback 10000

alors vous feriez:

  1. Affichez votre screenlogfichier:

    $ cat screenlog.<screen_window_num>
    
  2. Utilisez hardcopy -h(voir la page de manuel de l'écran) pour enregistrer le contenu de la fenêtre actuelle et son tampon de défilement dans le hardcopy.#fichier:

    <Escape key> (Ctrl-a by default)
    :hardcopy -h
    
Steve McKuhr
la source