Remove o caractere ^ M dos arquivos de log

4

Remova o caractere ^ M dos arquivos de log.

No meu script, eu redireciono a saída do meu programa para um arquivo de log. A saída do meu arquivo de log contém alguns caracteres ^ M (nova linha). Eu preciso removê-los durante a execução em si.

Meu comando:

$ java -jar test.jar >> test.log 

test.log tem:

Starting script ... ^M Starting script ...Initializing

    
por Ram 30.08.2013 / 07:35

4 respostas

16

Convertendo um arquivo autônomo

Se você executar o seguinte comando:

$ dos2unix <file>

O <file> terá todos os ^ M caracteres removidos. Se você quiser deixar <file> intacto, simplesmente execute dos2unix da seguinte forma:

$ dos2unix -n <file> <newfile>

Analisando a saída de um comando

Se você precisar fazer isso como parte de uma cadeia de comandos por meio de um canal, poderá usar qualquer número de ferramentas, como tr , sed , awk ou perl para fazer isso. / p>

tr

$ java -jar test.jar | tr -d '^M' >> test.log

sed

$ java -jar test.jar | sed 's/^M//g' >> test.log

awk

$ java -jar test.jar | awk 'sub(/^M/,"")' >> test.log

perl

$ java -jar test.jar | perl -p -e 's/^M//g' >> test.log

Digitando ^ M

Ao inserir o ^M , certifique-se de inseri-lo de uma das seguintes formas:

  1. Como Controle + v + M e não Deslocamento + 6 + M .
  2. Como uma barra invertida r, ou seja, ( \r ).
  3. Como um número octal ( 5 ).
  4. Como um número hexadecimal ( \x0D ).

Por que isso é necessário?

O ^M faz parte de como o fim das linhas é finalizado na plataforma Windows. Cada fim de linha é terminado com um caractere de retorno de carro seguido por um caractere de alimentação de linha.

Em sistemas Unix, o fim da linha é finalizado apenas por um caracter de avanço de linha.

  • caractere de alimentação de linha = 0x0A em hexadecimal, também escrito como \n .
  • caractere de retorno de carro = 0x0D em hexadecimal, também escrito como \r .

Exemplos

Você pode vê-los se canalizar a saída para uma ferramenta como od ou hexdump . Aqui está um arquivo de exemplo com a linha terminando os retornos de carro + os caracteres de avanço de linha.

$ cat sample.txt
hi there
bye there

Você pode vê-los com hexdump como \r + \n :

$ hexdump -c sample.txt 
0000000   h   i       t   h   e   r   e  \r  \n   b   y   e       t   h
0000010   e   r   e  \r  \n                                            
0000015

Ou como seu% hexadecimal0d + 0a :

$ hexdump -C sample.txt 
00000000  68 69 20 74 68 65 72 65  0d 0a 62 79 65 20 74 68  |hi there..bye th|
00000010  65 72 65 0d 0a                                    |ere..|
00000015

Executando isso por meio de sed 's/\r//g' :

$ sed 's/\r//g' sample.txt |hexdump -C
00000000  68 69 20 74 68 65 72 65  0a 62 79 65 20 74 68 65  |hi there.bye the|
00000010  72 65 0a                                          |re.|
00000013

Você pode ver que sed removeu o caractere 0d .

Exibindo arquivos com ^ M sem converter?

Sim, você pode usar vim para fazer isso. Você pode definir a configuração fileformat no vim, que terá o efeito de converter o arquivo como fizemos acima ou alterar o formato do arquivo na exibição vim .

alterando o formato de um arquivo

:set fileformat=dos
:set fileformat=unix

Você também pode usar a notação abreviada:

:set ff=dos
:set ff=unix

Como alternativa, você pode apenas alterar o formato de arquivo da exibição. Esta abordagem é não destrutiva:

:e ++ff=dos
:e ++ff=unix

Aqui você pode me ver abrindo o arquivo ^M , sample.txt in vim :

Agoraestouconvertendooformatodearquivonaexibição:

Veja o que parece quando convertido para o formato de arquivo unix :

Referências

por 30.08.2013 / 08:02
2

Insira o arquivo em dos2unix para corrigir os finais de linha.

Ou use um destes:

sed 's,\r$,,'
tr -d '\r'
    
por 30.08.2013 / 07:36
1

Você precisa consertar seu programa para chamar isatty() e se stdout não for um tty, então não envie o ^ M.

    
por 30.08.2013 / 15:34
0

Remoção de ^ M sem sinais especiais:

$ tr -d '5' <file1 >file2 

$ mv file2 file1
    
por 05.02.2016 / 00:34