Eu posso usar o comando "script" para gravar uma sessão interativa na linha de comando. No entanto, isso inclui todos os caracteres de controle e códigos de cores. Posso remover caracteres de controle (como backspace) com "col -b", mas não consigo encontrar uma maneira simples de remover os códigos de cores.
Observe que eu quero usar a linha de comando da maneira normal, então não quero desativar as cores lá - só quero removê-las da saída do script. Além disso, eu sei que posso brincar e tentar encontrar um regexp para consertar as coisas, mas espero que exista uma solução mais simples (e mais confiável - e se houver um código que eu não conheço quando desenvolvo o regexp?).
Para mostrar o problema:
spl62 tmp: script Script iniciado, arquivo digitado spl62 lepl: ls add-licence.sed build-example.sh commit-test push-docs.sh add-licence.sh build.sh delete-licence.sed setup.py asn build-test.sh delete-licence.sh src build-doc.sh limpo doc-src test.ini spl62 lepl: exit Script feito, o arquivo é datilografado spl62 tmp: cat -v datilografado Script iniciado em Qui 09 Jun 2011 09:47:27 CLT spl62 lepl: ls ^ M ^ [[0m ^ [[00madd-licence.sed ^ [[0m ^ [[00; 32mbuild-example.sh ^ [[0m ^ [[00mcommit-test ^ [[0m ^ [[00; 32mpush-docs.sh ^ [[0m ^ M ^ [[00; 32madd-licence.sh ^ [[0m ^ [[00; 32mbuild.sh ^ [[0m ^ [[00mdelete-licence.sed ^ [[0m ^ [[00msetup.py ^ M] M ^ [[01; 34masn ^ [[0m ^ [[00; 32mbuild-test.sh ^ [[0m ^ [[00; 32mdelete-licence.sh ^ [[0m ^ [[01; 34msrc ^ [[0m ^ M ^ [[00; 32mbuild-doc.sh ^ [[0m ^ [[00; 32mclean ^ [[0m ^ [[01; 34mdoc-src ^ [[0m ^ [[00mtest.ini ^ [[0m ^ M spl62 lepl: exit ^ M Script realizado em Qui 09 Jun 2011 09:47:29 CLT spl62 tmp: col -b <tipo de letra Script iniciado em Qui 09 Jun 2011 09:47:27 CLT spl62 lepl: ls 0m00madd-licence.sed0m 00; 32mbuild-example.sh0m 00mcommit-test0m 00; 32mpush-docs.sh0m 00; 32madd-licence.sh0m 00; 32mbuild.sh0m 00mdelete-licence.sed0m 00msetup.py0m 01; 34masn0m 00; 32mbuild-test.sh0m 00; 32mdelete-licence.sh0m 01; 34msrc0m 00; 32mbuild-doc.sh0m 00; 32mclean0m 01; 34mdoc-src0m 00mtest.ini0m spl62 lepl: exit Script realizado em Qui 09 Jun 2011 09:47:29 CLT
fonte
A atualização da resposta de Gilles para também remover retornos de carro e apagar backspace de caracteres anteriores, que eram importantes para mim para um texto datilografado gerado no Cygwin:
fonte
Eu usaria
sed
neste caso.Faz:
cat -v typescript | sed -e "s/\x1b\[.\{1,5\}m//g"
sed -e "s / pesquisar / substituir / g" é uma coisa padrão. o regex é explicado como abaixo:
\x1b
coincidir com o escape anterior ao código de cores\[
corresponde ao primeiro colchete aberto.\{1,5\}
corresponde a 1 a 5 de qualquer caractere único. Tenha que\
usar o aparelho para impedir que a concha os destrua.m
último caractere em regex - geralmente segue o código de cores.//
string vazia para o que substituir tudo.g
combine-o várias vezes por linha.fonte
foo\e[1m(1m = {
torna-se emfoo = {
vez defoo(m = {
), substituindo.
por[0-9;]
é mais preciso..\{1,5\}
com[^m]\{1,5\}
para isso - mas também notar que esta, mesmo assim, ainda só remove códigos "gráficos rendition" (aqueles que terminam em umm
) - basicamente, cor, reverso, negrito e itálico estilos (quando aplicável).\x1b(B
(incluído no ferrugens saída de cores)\x1b
e não\033
?\u001b
vez de\x1b
fonte
=> como usar:
testado em: - AIX 5.x / 6.1 / 7.1 - Linux Mandrake / Mandriva / SLES / Fedora - SunOS
fonte
Resolvi o problema executando
scriptreplay
uma tela e despejando o buffer de rolagem em um arquivo.O script esperado a seguir faz isso por você.
Foi testado para arquivos de log com até 250.000 linhas. No diretório de trabalho, você precisa do seu scriptlog, um arquivo chamado "time" com 10.000.000 vezes a linha "1 10" e o script. Eu preciso do nome do seu arquivo de script como argumento de linha de comando, como
./name_of_script name_of_scriptlog
.O arquivo de hora pode ser gerado por
fonte
delay
blocksize
", então não há razão para não apenas "0
<entirefile>
" fazê-lo e despejar tudo sem demora. Você pode fazer isso assumindo o tamanho do script menos a primeira linha (tail -n +2 typescript|wc -c
) e criando o arquivo de temporização comecho "0 "`tail -n +2 typescript|wc -c` > timing
. Isso será basicamente instantâneo escriptreplay
reproduzirá o script inteiro na velocidade mais rápida possível.Encontrei essa pergunta enquanto procurava a solução para o mesmo problema. Um pouco mais cavando e encontrei esse script no Live Journal neste link. Eu trabalhei perfeitamente para mim. Também é uma excelente descrição sobre esse problema e como a solução funciona. Definitivamente vale a pena ler. http://jdimpson.livejournal.com/7040.html
fonte
Eu preferiria usar ferramentas especializadas para converter a saída de script em texto sem formatação, que é constantemente suportado e bem testado, em vez da regexp personalizada. Então, isso funcionou para mim:
O comando script captura no arquivo datilografado ansi2txt - converte o código ansi com escapes como códigos de cores, backspaces etc. em texto normal, no entanto, descobri que ainda restam alguns escapes. col -bp - removeu-os completamente.
Eu testei isso no disco mais recente do Ubuntu e funciona.
fonte
Há um
ansi2txt
comando nocolorized-logs
pacote no Ubuntu. Ele remove os códigos de cores ANSI, mas não lida com coisas como barras de progresso produzidas pela emissão^H
ou^M
caracteres para substituir o texto no local.col -b
pode lidar com isso , para obter melhores resultados, você pode combinar os doisfonte
Eu descobri que apenas o uso
cat
era tudo o que eu precisava para ver a saída doscript
terminal. Isto não ajuda ao redirecionar a saída para outro arquivo, mas faz o resultado legível, ao contráriocat -v
,col -b
ou um editor de texto.Para eliminar cores ou salvar os resultados em um arquivo, copie e cole manualmente a saída
cat
em um editor de texto ou em outrocat
comando, ou seja:fonte
script
execução incluiu saída com códigos de cores anexados, como no caso do OP?cat
apresenta as cores originais, que podem ser removidas copiando e colando manualmente. O OP usoucat -v
ecol -b
, os quais apresentam códigos em vez de um resultado final formatado corretamente. Eu editei minha resposta.Seguindo a última resposta que usa tr e: cntrl: poderíamos talvez fazer
sed "/^[[:cntrl:]]/d" output.txt
Isso parece funcionar para mim, porque todas as linhas geradas pelo vi começam com um caractere de controle. Isso também remove linhas em branco e linhas que começam com uma guia, embora isso funcione para o que estou fazendo. Talvez haja uma maneira de corresponder a qualquer caractere de controle, exceto \ n \ m \ t.
Talvez possamos procurar o caractere de controle específico, e parece que todas as linhas indesejadas geradas pelo vi começam com o que parece ^ [. hexdump me diz que o primeiro caractere é 1b, então isso parece funcionar também
sed "/^\x1b/d" output.txt
Isso se parece com uma resposta postada acima, mas não funciona corretamente porque, após a execução do comando, alguns caracteres indesejados já são adicionados à linha de comando como se o usuário os tivesse digitado.
fonte
ls --color
(como mostrado na pergunta), sua solução excluirá quase todas as linhas que contêm informações. Não é bom. Mas obrigado por deixar de fora o uso inútil decat
. :-) tr
- traduzir ou excluir caracteresfonte
01;34m
por exemplo, e removerá o final da linhanewline (\n)
.