Estou usando o comando 'script' do linux http://www.linuxcommand.org/man_pages/script1.html para rastrear algumas sessões interativas. Os arquivos de saída contêm caracteres não imprimíveis, incluindo minhas teclas de backspace.
Existe uma maneira de arrumar esses arquivos de saída para que eles contenham apenas o que foi exibido na tela?
Ou existe outra maneira de gravar uma sessão de shell interativa (entrada e saída)?
Respostas:
Se você deseja visualizar o arquivo, pode enviar a saída
col -bp
; isso interpreta os caracteres de controle. Então você pode canalizar menos, se quiser.Em alguns sistemas
col
não aceitariam um argumento de nome de arquivo, use esta sintaxe:fonte
col
não aceitaria um nome de arquivo, então aceiteicol -bp < typescript
e consegui o que queria.less -R
por si só, fornece uma saída melhor do que a tubulaçãocol -bp
primeiro.col -bp <typescript | less -R
não exibe o console colorido. O usoless -R typescript
exibe o console colorido!less
.aqui está uma interpretação da entrada de string para
perl
:s/pattern//g
significa fazer uma substituição nag
cadeia de entrada inteira (a opção significa fazer a coisa toda em vez de parar no primeiro substituto)aqui está uma interpretação do padrão regex:
\e
corresponde ao caractere de controle "escape" especial (ASCII 0x1A)(
e)
são o começo e o fim de um grupo|
significa que o grupo pode corresponder a um dos N padrões. onde os padrões N são[^\[\]]
ou\[.*?[a-zA-Z]
ou\].*?\a
[^\[\]]
significa[
e]
\[.*?[a-zA-Z]
significa[
seguida, faça um não ganancioso.*?
até o primeiro caractere alfa\].*?\a
significa]
e faça um não ganancioso.*?
até atingir o caractere de controle especial chamado "o caractere de alerta (sino)"fonte
typescript
para umperl
programa que remove certos caracteres de controle da saída e canaliza a saída para ocol
comando unix , cuja-b
opção remove qualquer artefato de chave "excluir" na transcrição. Em seguida, canaliza a saída para um arquivo de texto.Para uma grande quantidade de
script
saída, eu hackeava um script perl juntos iterativamente. Caso contrário, edite manualmente com um bom editor.É improvável que exista um método automatizado existente para remover caracteres de controle da
script
saída de uma maneira que reproduza o que foi exibido na tela em determinados momentos importantes (como quando o host estava esperando pelo primeiro caractere de alguma entrada do usuário).Por exemplo, a tela pode ficar em branco, exceto
Andrew $
, se você digitarrm /*
e pressionar a tecla backspace doze vezes (muito mais do que o necessário), o que é mostrado na tela no final depende de qual shell estava em execução, quais são as suasstty
configurações atuais ( que você pode alterar parcialmente durante uma sessão) e provavelmente alguns outros fatores também.O acima se aplica a qualquer método automatizado de captura contínua de entrada e saída. A principal alternativa é tirar "capturas de tela" ou recortar e colar a tela em momentos apropriados durante a sessão (que é o que faço nos guias do usuário, notas para um diário, etc.).
fonte
Uma resposta para a segunda parte da minha pergunta é usar o recurso de registro na tela do gnu:
^A H
de dentro de uma sessão de tela em execução. A documentação está em http://www.gnu.org/software/screen/manual/screen.html#Loggingfonte
Eu usei o
cat filename
que remove os caracteres de controle :-)fonte
Se você deseja gravar seus comandos (por exemplo, transformá-los posteriormente em um script bash), é necessário executar um hack razoável e
script(1)
, dentro dele, executarDepois,
grep
o arquivo de saída (normalmente "datilografado") procura linhas iniciando com um "+". A expressão regular^\+
fará o truque.fonte
Se você deseja gravar a saída em um arquivo:
use o comando unix2dos para converter o arquivo para o formato Windows, se desejar
fonte
col -bp processa os backspaces conforme desejado (AFAIK). Mas controla as seqüências de escape de cores. Pode ser bom remover as seqüências de cores primeiro e depois processar os backspaces, se possível.
Essa é uma necessidade muito comum e estou surpreso por não haver mais soluções para isso. É extremamente comum criar um script para uma sessão e alguém precisa revisar o procedimento. Você deseja eliminar todos os pequenos erros de digitação e seqüências de escape de cores para criar um script "limpo" do procedimento para referência futura. Texto ASCII simples preferido. Eu acho que é isso que se entende por "legível por humanos", e é uma coisa muito razoável de se fazer.
fonte
Eu achei a resposta que dewtall forneceu a uma pergunta semelhante no quadro Unix para ser mais eficaz na remoção de caracteres de controle da saída do script, se você estiver em um ambiente em que o Perl esteja disponível.
roteiro de dewtall:
Para remover os caracteres de controle:
fonte
https://github.com/RadixSeven/typescript2txt foi escrito para resolver esse problema.
Faz quatro anos desde a última vez que o atualizei / usei, mas não me lembro de ter feito algo sofisticado que ainda não deveria funcionar hoje.
fonte
Eu encontrei uma boa maneira de fazê-lo. No meu sistema, linhas de saída longas são salpicadas com "^ M" (espaço em branco seguido de retorno de carro). O "^ M" pode ser bem substituído pelo caractere nulo "^ @", que não é exibido quando você cria o arquivo.
Também capturo o tempo, portanto, para reproduzir o arquivo perfeitamente, não posso simplesmente remover "^ M" completamente usando os comandos abaixo (porque o scriptreplay conta bytes):
Eu executo meu comando de script assim:
Então, o que eu faço depois é:
A primeira edição (antes da reprodução) mantém o número de bytes no arquivo. A segunda edição (após a reprodução) se livra do espaço em branco em lugares aleatórios. (Observe que, por padrão, o scriptreplay procura o arquivo de entrada chamado "typescript", motivo pelo qual não o forneci após o "tempo".)
fonte
dos2unix na saída também fará o truque
fonte
Uma outra solução é usar o
strings
que imprime apenas caracteres imprimíveis de um arquivo (ou da entrada padrão):A
-n 1
opção define o comprimento mínimo das seqüências a serem preservadas para uma e, assim, garante a preservação de caracteres imprimíveis únicos cercados por caracteres não imprimíveis.Uma possível desvantagem dessa abordagem é que ela
strings
adiciona quebras de linha entre cadeias contíguas de caracteres imprimíveis. Por exemplo, um arquivo com conteúdo(onde
<SOMECONTROLCHAR>
está o caractere de controle ou qualquer outro caractere não imprimível) seria retornado comoOutra questão levantada nos comentários é que algumas seqüências de caracteres de controle consistem em uma combinação de caracteres imprimíveis e não imprimíveis e essa abordagem remove apenas parte deles.
No entanto,
strings
faz um bom trabalho ao remover caracteres de controle como o backspace mencionado na pergunta.fonte
strings
não remove todos os caracteres não imprimíveis. Ele identifica e imprime seqüências de caracteres imprimíveis . Isso não é a mesma coisa.strings
apenas imprime seqüências com um comprimento mínimo de 4. Corrigi minha resposta adicionando a-n 1
opção que define o comprimento mínimo como 1. Obrigado por apontar isso.strings
remove todos os caracteres não imprimíveis, por isso ainda está errada da mesma forma que estava antes da edição. Também está obviamente quebrado porque "alguns códigos de cores" (e códigos de controle em geral) geralmente consistem em caracteres imprimíveis e não imprimíveis. Por exemplo, uma sequência de código de controle para alterar a cor do texto pode estarESC[01;52m
ondeESC
está o caractere de escape único (valor de byte 27). Usarstrings
como você sugere deixaria[01;52m
na saída, o que não faz sentido.strings
pode não fazer o mesmo trabalho que algumas das outras respostas, mas IMHO é uma abordagem válida para resolver o problema descrito na pergunta.