# WINDOWS和UNIX换行符的理解
**file1.txt**
17.143.161.37 其他 美国
54.163.255.40 其他 美国 弗吉尼亚州 亚马逊公司
**[root@localhost home]# cat -v file2.txt | head**
> -v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
17.143.161.37 M-eM-^EM-6M-dM-;M-^V M-gM->M-^NM-eM-^[M-=^M
54.163.255.40 M-eM-^EM-6M-dM-;M-^V M-gM->M-^NM-eM-^[M-= M-eM-<M-^WM-eM-^PM-^IM-eM-0M-<M-dM-:M-^ZM-eM-7M-^^ M-dM-:M-^ZM-iM-)M-,M-iM-^@M-^JM-eM-^EM-,M-eM-^OM-8^M
可以看到在每行的末尾有个^M
while read line
do
ip=`echo $line | awk '{print $1}'`
echo "---------> "$line
delay=`ping -c 1 -W 1 "${ip}" | grep "bytes from" | cut -d " " -f 7 | cut -d "=" -f 2`
echo $line" "${delay} >> delay.log
done < ipdata.txt
但是没有显示想要的结果,时延反而打在每行的开头。结果如下:
28158.178 其他 美国
26287.7 其他 比利时
74.852.57 其他 韩国
## 原因
ipdata.txt文件是从windows主机copy到linux主机,且采用windows格式,所以怀疑是文件格式问题导致,将文件格式更改为unix格式后,脚本运行正常。
217.79.179.106 其他 德国 372
200.73.229.105 其他 巴西 440
62.182.67.244 其他 乌克兰 404
### WINDOW & LINUX的换行区别
Text files created on DOS/Windows machines have different line endings than files created on Unix/Linux
DOS uses carriage return and line feed ("\r\n") as a line ending, CRLF ( \r\n , 0D 0A )
which Unix uses just line feed ("\n"). LF ( \n , 0A ).
0D CR (carriage return) 回车键 displayed "^M" in Unix and Linux.
所以脚本中此条命令echo $line" "${delay} >> delay.log
读取完$line后每行后面多了个\r,表示回车,即回到每行的行首,所以${delay}会在行首覆盖显示
#### 历史
早期的计算机输出设备不是显示器,而是电传打字机,结构与普通的打字机差不多。有一个打印头在纸上打字,同时有一个电动机控制纸张的进出。当打印头到达行尾的时候,需要两个动作才能够到达下一行的行首:首先执行回车动作,将打印头移动到本行的行首,然后进行换行动作,电动机将纸张向上移动一行,这样打印头就处于下一行的行首,可以继续进行打印。回车和换行对应的控制字符分别是\r和\n,这就是windows中换行符为\r\n的由来。后来由于经常连续执行,所以在打印机中将这两个控制字符简化为一个控制字符,这就是linux/unix中的换行符\n的由来。
#### 解决
In [vim](http://www.vim.org/), use `:set ff=unix` to convert to Unix; use `:set ff=dos` to convert to Windows.