2019-06-14 Windows Unix OSX各操作系统
2019-06-15 本文已影响0人
四火流年
Unix、Windows、OSX系统下的换行符
Windows系统下,换行是<回车换行>(Carriage Return and Line Feed,即 CRLF):
- CR - \r,在ASCII字符表里的编号是13,用二进制表示即 0x0d
- LF - \n,在ASCII字符表里的编号是10,用二进制表示即 0x0a
Unix系统,采用的是 LF 作为换行符。
Mac系统曾经使用过 CR 作为换行符,但是在 Mac OS X 之后,又换为了LF。
- Command-line tools in OS X (and other UNIX or Linux variants) use UNIX-style line endings. This means that each line in a text file ends with a newline character (character 10/0xA, often abbreviated LF).
- Many older Mac applications use "Mac-style” line endings. This means that each line in a text file ends with a carriage return character (character 13/0xD, often abbreviated CR).
以上摘自Designing Scripts for Cross-Platform Deployment
如何查看换行符
使用xxd
命令可以查看二进制文件,从而可以看出文件的换行符是\r、\n、还是\r\n。
~ cat /tmp/aaaa
abc
def
ghi
~ xxd /tmp/aaaa
00000000: 6162 630a 6465 660a 6768 690a abc.def.ghi.
可以看出该文件的换行符是 LF, 即0a、\n
注:当前系统是OS X,上面以及下面的测试都是在该环境下进行的。
VIM下切换换行符
Vim 可以通过set ff=mac|unix|dos
的方式进行换行符的切换。
切换成Mac系统
~ cat /tmp/aaaa
abc
def
ghi
~ xxd /tmp/aaaa
00000000: 6162 630a 6465 660a 6768 690a abc.def.ghi.
~ vim /tmp/aaaa (执行命令 :set ff=mac,)
~ xxd /tmp/aaaa
00000000: 6162 630d 6465 660d 6768 690d abc.def.ghi.
切换成Dos系统
~ cat /tmp/aaaa
abc
def
ghi
~ xxd /tmp/aaaa
00000000: 6162 630a 6465 660a 6768 690a abc.def.ghi.
~ vim /tmp/aaaa (执行命令 :set ff=mac,)
~ xxd /tmp/aaaa
00000000: 6162 630d 0a64 6566 0d0a 6768 690d 0a abc..def..ghi..
换行符不同会带来的问题
以换行符CR为例:
用VIM打开换行符为CR的文件
当前系统是OS X,使用的是Unix模式,所以是以LF作为换行符,在查不到该字符的情况下,也就不会换行,所以看起来像是只有一行。
VIM打开CR为换行符的文件.png
输入^M这个符号的方式是:Ctrl V + Ctrl M
对文件的处理
~ xxd /tmp/aaaa
00000000: 6162 630d 6465 660d 6768 690d abc.def.ghi.
~ cat /tmp/aaaa
~ wc /tmp/aaaa
0 3 12 /tmp/aaaa
~ wc -l /tmp/aaaa
0 /tmp/aaaa
cat
命令无法正确打印出该文件的内容,wc -l
命令也无法正确打印出该文件的行数。
此外,很多程序在处理文件时,都默认以LF做为换行符,那么在读取文件时,如果一直扫描不到LF,那么就无法解析和结束。
总结此篇分享的原因就是,在使用logstash
的split
插件处理以CR为换行符的文件时,程序会卡住。
注意:
Vim保存文档时会自动在结尾加上0a
在测试环境调试split时,我用“截短后的原始数据”,调试成功。
但是实际上,这样的数据和真正的原始数据是不一样的,导致用split处理真正的数据时卡住了。
~ xxd /tmp/aaaa
00000000: 6162 630d 6465 660d 6768 690d abc.def.ghi.
~ vim /tmp/aaaa (在最前头增加一个 a,然后保存退出)
~ xxd /tmp/aaaa
00000000: 6161 6263 0d64 6566 0d67 6869 0d0a aabc.def.ghi..
(最后面多了一个0a,这就是Vim自动加上的)