Shell

從日誌文件中刪除 ^M 字元

  • February 4, 2016

從日誌文件中刪除 ^M 字元。

在我的腳本中,我將程序的輸出重定向到日誌文件。我的日誌文件的輸出包含一些 ^M(換行符)字元。我需要在執行時刪除它們。

我的命令:

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

test.log擁有:

開始腳本 … ^M 開始腳本 …正在初始化

轉換獨立文件

如果您執行以下命令:

$ dos2unix <file>

<file>刪除所有 ^M 字元。如果你想<file>保持原樣,那麼只需dos2unix像這樣執行:

$ dos2unix -n <file> <newfile>

解析命令的輸出

如果您需要通過管道將它們作為命令鏈的一部分執行,您可以使用任意數量的工具,例如trsedawkperl來執行此操作。

孩子們

$ 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

鍵入 ^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

           ss 來自 #1

現在我在視圖中轉換文件格式:

           ss 來自 #2

這是轉換為文件格式後的樣子unix

           ss 來自 #3

參考

引用自:https://unix.stackexchange.com/questions/88811