购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.5 文件处理

Linux上有很多处理文件的工具。本节将选几个典型的处理场景,例如,彩色打印、乱码处理、文件比对后合并、校验文件完整性及按分隔符剪切字符等来讲解对应的Linux命令工具。

3.5.1 文件乱码处理:文件编码、inode与dos2unix

在使用Linux服务器时,大多读者都用Windows进行开发、测试、运维这样的生产活动,而两端(Windows、Linux)编码一致性的问题导致我们将Windows上的一些文件放入Linux中,总会出现一些乱码现象。

1.Xshell显示中文乱码

(1)在Linux中,文件显示中文乱码,如图3.2所示。其解决方法是修改终端(这里用的是Xshell)的文件编码。

图3.2 中文乱码

(2)打开Xshell的“文件”→“当前会话属性”菜单。如果想永久解决中文乱码,打开“默认会话属性”,选择“终端”→“编码”选项卡,设置默认语言为“UTF-8”。

(3)回到Shell界面,重新使用“ll”查看当前目录,可以发现乱码文件已经变为可识别的。编码修改前后对比如图3.3所示。

图3.3 编码修改前后对比

2.Xftp显示中文乱码

当我们使用Xshell连接服务器时,看到的中文文件是正常的。但在使用Xftp想要在相应的目录下上传或下载文件时,却发现是乱码。处理这种问题只需要更改默认的工具。依次选择“文件”→“属性”→“选项”→“编码”→“UTF-8”命令,基本就可以解决此类问题。

3.UTF-8下文件中文名乱码重命名

使用上述方法解决文件名乱码问题后,读者可能还会遇到一些新的问题。例如,重新设置“UTF-8”后再打开文件还是乱码,甚至连使用命令“rm-f xx”也无法删除文件。这是因为乱码的问题,导致根本不知道真实文件名是什么,进而没法删除。

遇到这种问题不要慌,记住一个概念:在Linux中,只有“inode”才是唯一标识。

(1)使用ls或ll命令查看文件的inode。命令如下:

(2)找到inode后如何重命名呢?这时,就要用到find命令了。命令如下:

(3)如果没有遇到乱码,那么如何测试这个解决乱码的方法呢?很简单,先将Xftp设置为非“UTF-8”编码,Xshell设置为“UTF-8”编码。然后在Xftp中直接创建一个中文目录或文件。最后在Xshell下就可以看到乱码文件了。

(4)创建好测试文件后,读者在Shell中使用“ll-i”命令可以看到当前目录下确实有乱码文件,并且乱码文件的inode是666328,找到这个inode就可以对文件重命名或删除了。

(5)改名之后,在Xshell中已经可以正常显示中文文件,但文件的inode并不会改变。

4.特殊字符导致的文件乱码

以上都是文件名乱码,有时读者还会遇到内容乱码的问题。

一个真实的案例:在部署脚本时,因运维人员在Windows上修改了脚本,导致.sh脚本中多了一些特殊字符,无法启动。当时采用的办法是删除全部脚本并重写。

后来又一次遇到内容乱码的问题,运维人员想到是不是由隐藏字符导致的,于是使用“vim-b”找到隐藏字符“^M”,解决了这个问题。

当再一次遇到脚本无法启动的问题,此时运维人员使用“vim-b”也找不到隐藏字符,于是使用“cat-A”方法,找到了隐藏字符“M-BM-”。我们可以在搜索引擎下搜索“特殊字符M-BM-”的解决方法。

这里介绍两个解决特殊字符的方法。一是用sed,二是用文件格式转换工具dos2unix。命令如下:

我们不仅可以使用dos2unix工具转换特殊字符,而且遇到其他内容乱码问题时,还可以尝试使用此工具来解决。

5.dos2unix速查手册

dos2unix命令可以将文本文件的DOS(Windows)格式转换成UNIX格式。而将文本文件的UNIX格式转成DOS格式的是unix2dos命令。

文本文件格式为什么需要转换呢?这是因为文本文件的 DOS 格式下,一些隐藏符号与Linux上的标志并不一致(如换行符“\r\n”在Linux中会变成“^M”),因此产生了两种格式文件相互转换的需求。

为什么文件格式转换使用的是 dos2unix 呢?前面的章节已经讲过,Linux 有许多特性都是继承UNIX的,文件格式也大致如此,所以这个转换命令中的“2unix”含义是To UNIX。

dos2unix在许多Linux发行版本中并不是自带的工具,需要额外安装,安装命令如下:

(1)dos2unix命令的语法格式:dos2unix [选项][文件]。

(2)dos2unix命令一般使用默认选项“-o”,其选项说明如表3.23所示。

表3.23 dos2unix命令的选项说明

(3)dos2unix命令示例。

3.5.2 文件比对、校验与剪切:diff/vimdiff、md5sum、cut

1.diff/vimdiff命令速查手册

diff(Difference)命令可以逐行比较文本内容,并输出文件差异。vimdiff命令则可以调用vim命令打开多个文件,以不同颜色区分文件内容差异。常用示例如下:

vimdiff命令可以使用内置命令对多个文件进行比对、合并等操作,如表3.24所示。

表3.24 vimdiff命令的常用内置命令

2.文件校验:md5sum

md5sum(Message-Digest Algorithm)命令可以用来计算校验文件中的md5值。顾名思义,它采用的是MD5算法。在下载文件时常常见到MD5算法,MD5算法通常被用来验证网络文件传输的完整性,防止文件被人篡改。

我们在各个网站下载App、工具时,官网都会提供一个md5码,防止文件下载时被篡改或植入病毒、木马等破坏性程序。

(1)md5sum命令的语法格式:md5sum [选项][文件]。

(2)md5sum命令示例。

3.字符剪切:cut

cut命令的主要作用是根据分隔符提取文件中的指定内容。

(1)cut命令的语法格式:cut[选项][文件(可选)],无文件参数时读取标准输入。

(2)cut命令示例。

注意: 在Linux中,一般文件都是UTF-8编码。在UTF-8编码文件中,一个英文字母占1字节,一个中文汉字(含繁体)占3字节。如果是ASCII编码,则一个英文字母(不区分大小写)占1字节,一个中文汉字占2字节。如果是Unicode编码,则一个英文字母占2字节,一个中文汉字(含繁体)占2字节。

3.5.3 其他命令:od、iconv、tr、split、paste、rev、tee、join、uniq

本节讲述一些不常用的文件处理命令,但这些文件处理命令在某些情况下也会颇有作用。实际上,Linux的文件处理命令当然不止本书所述的内容。在大多情况下,这些命令已足够使用。

1.od命令速查手册

od命令可以用来转换文本进制,即转换为八进制、十六进制或其他格式编码。示例如下:

2.iconv命令速查手册

iconv命令的功能与dos2unix命令的功能类似,也用于文件编码转换。示例如下:

3.tr命令速查手册

tr命令的主要作用是替换。在替换英文字符时比较好用,尽量不要用于中文替换。

4.split命令速查手册

split命令的主要作用是可以按照行数或文件大小进行文件的分割。

5.paste命令速查手册

paste命令可以将文件合并在一起,默认的分隔符是“Tab”,可以实现多列合并及列转行。生成测试文件如下:

6.rev命令速查手册

7.tee命令速查手册

8.join命令速查手册

注意: join命令的数据合并要经过排序。如果相同字段是乱序,则需要使用sort命令进行排序。

9.uniq命令速查手册 JkeOlDqnoTDpmJk1X7J9enE+nyO2Nk0kmrBf5d6Cq0RZ7ceqTQG5aCMH1IM+Gv7v

点击中间区域
呼出菜单
上一章
目录
下一章
×