Removendo os caracteres de escape do log de tela do GNU Screen.% N

14

É possível remover as seqüências ESC no arquivo de saída do GNU Screen? Coisas como cores, tabulações e outros caracteres de escape entram nos arquivos de log e se tornam difíceis de decifrar.

Eu tentei o Dr. Google & Co., além de ler o manual, mas não consegui encontrar nada adequado ...

Talvez eu tenha esquecido alguma coisa?

shaond
fonte

Respostas:

11

Experimente este pedaço de magia Perl:

perl -ne 's/\x1b[[()=][;?0-9]*[0-9A-Za-z]?//g;s/\r//g;s/\007//g;print' < screenlog.0
whitequark
fonte
Obrigado por isso - isso é INCRÍVEL! Ele ainda tem os personagens M ^ G e ^ em lá, mas é um muito mais legível ...
shaond
1
Adicionado isso à expressão.
whitequark
Gostaria de saber quantas faces ASCII existem nesse liner. Eu parei de contar em torno de 20.
John T
4
Claro que posso escrever outra frase que os conte.
Whitequark
10

Use ansifilter.

ansifilter screenlog.txt > screenlog.txt.clean
Jan
fonte
isso é algo em todo sistema linux ou algo que precisa ser instalado?
Journeyman Geek
O @JourneymanGeek não está nos repositórios do Ubuntu, então eu diria que não é exatamente popular. Parece que você precisa obtê-lo da página do projeto e executar / compilar-se. Wouldnt exatamente chamá-lo um programa popular ansifilter.sourceforge.net
Simon Sheehan
Estou no OSX e usado brew install ansifiltere funcionou como um encanto.
thekingoftruth
1
Não sei como isso mudou desde os comentários de 2012 sobre distribuição, mas encontrei isso no repositório da versão atual do Fedora (22).
dmh
10

Tente também a opção -r ou -R de less.

less -r screenlog.0
dex
fonte
Ótima solução. Ele lida com todos os caracteres ^ H (excluir) corretamente, exibe barras de progresso sem a crosta ^ M e preserva até o prompt de cores! Obviamente, às vezes, exibir um log não é suficiente.
Quantum7
5

Depois de capturar sua sessão no screenlog.n, você pode posicionar o arquivo no terminal e usar o comando de cópia impressa da tela para despejar a saída do gato em um arquivo. O resultado fornecerá uma saída limpa que não possui nenhuma sequência de escape.

A única 'pegadinha' parece ser a de garantir que a cópia impressa capture tudo no buffer de rolagem e que o buffer de rolagem contenha apenas o que você deseja capturar.

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 

Observe que -h garante que você capture todo o histórico de rolagem e não apenas o que está à vista imediata

O arquivo screenlog.n.cleaned agora conterá uma cópia impressa da saída do gato e não incluirá nenhuma sequência de escape

Joel Verks
fonte
Muito, muito arrumado . Todos os outros linux perl / sed / python falharam para mim. Muito frustrante ao pensar que menos -r / more estavam manipulando meu arquivo diretamente. Uma sugestão wc -lnão funcionou para mim. Ele retornou 28226, mas realmente precisava de 33031 no meu caso.
malat
4

Eu uso o stringscomando para tornar um log de tela legível. No Debian, faz parte do pacote binutils.

Como sua página de manual diz:

strings - encontre as strings imprimíveis em um objeto ou outro arquivo binário

blasio
fonte
2

Se você for screenusuário, a solução de cópia impressa em tela sugerida pela publicação de Joel Verks funcionará melhor - assumindo que você tenha uma grande rolagem definida em seu .screenrc:

defscrollback 10000

então você faria:

  1. Exiba seu screenlogarquivo:

    $ cat screenlog.<screen_window_num>
    
  2. Use hardcopy -h(consulte a página de manual da tela) para salvar o conteúdo atual da janela e seu buffer de rolagem no hardcopy.#arquivo:

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