从日志文件中删除 ^M 字符

从日志文件中删除 ^M 字符

从日志文件中删除 ^M 字符。

在我的脚本中,我将程序的输出重定向到日志文件。我的日志文件的输出包含一些 ^M(换行符)字符。我需要在运行时删除它们。

我的命令:

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

test.log有:

启动脚本...^M 启动脚本...初始化

答案1

转换独立文件

如果您运行以下命令:

$ dos2unix <file>

<file>删除所有 ^M 字符。如果你想保持<file>原样,那么只需dos2unix像这样运行:

$ dos2unix -n <file> <newfile>

解析命令的输出

如果您需要通过管道将它们作为命令链的一部分来执行,则可以使用任意数量的工具(例如trsedawk或 )perl来执行此操作。

t

$ 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

珀尔

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

键入 ^M

输入时请^M务必通过以下方式之一输入:

  1. 作为Control+ v+M而不是Shift+ 6+ M
  2. 作为反斜杠r,即( \r)。
  3. 作为八进制数 ( \015)。
  4. 作为十六进制数 ( \x0D)。

为什么这是必要的?

^M是 Windows 平台上行尾终止方式的一部分。每行的末尾都以回车符和换行符结束。

在 Unix 系统上,行尾仅由换行符终止。

  • 换行符 =0x0A十六进制,也写为\n.
  • 0x0D十六进制的回车符 = ,也写为\r.

例子

如果将输出通过管道传输到od或等工具,您可以看到这些hexdump。下面是一个示例文件,其中包含以回车符 + 换行符结尾的行。

$ cat sample.txt
hi there
bye there

您可以使用hexdumpas \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

或者作为它们的十六进制0d+ 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

运行这个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

您可以看到sed已删除该0d角色。

使用 ^M 查看文件而不进行转换?

是的,您可以用来vim执行此操作。您可以fileformat在 vim 中进行设置,这将具有像我们上面所做的那样转换文件的效果,或者您可以在视图中更改文件格式vim

更改文件格式

:set fileformat=dos
:set fileformat=unix

您也可以使用简写符号:

:set ff=dos
:set ff=unix

或者,您可以只更改视图的文件格式。这种方法是非破坏性的:

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

在这里你可以看到我打开我们的^M文件,sample.txtvim

           vim dos #1 的 ss

现在我正在视图中转换文件格式:

           vim dos 的 ss #2

转换为文件格式后的样子如下unix

           vim dos 的 ss #3

参考

答案2

将文件推入dos2unix以修复行结尾。

或者,使用其中之一:

sed 's,\r$,,'
tr -d '\r'

答案3

您需要修复您的程序以进行调用isatty(),如果 stdout 不是 tty,则不要输出 ^M。

答案4

去掉没有特殊符号的^M:

$ tr -d '\015' <file1 >file2 

$ mv file2 file1

相关内容