RHCSARHCE 红帽Linux认证学习指南(第7版)EX200 & EX300
上QQ阅读APP看书,第一时间看更新

认证目标3.03 文本文件的管理

Linux和Unix都通过一系列文本文件进行管理。Linux系统管理员通常不喜欢用图形编辑器管理这些配置文件。像OpenOffice.org Writer或微软的Word这类的编辑器通常会把文件保存为二进制格式,或者会修改纯文本文件的编码。除非文本文件按原始格式保存,否则对文本做任何修改都可能导致Linux系统无法启动。

Linux命令把文本文件当作数据流进行管理。你在前面已经看到重定向符和管道符等工具的作用。但是如果没有合适的工具将数据进行分类处理,我们可能会被数据淹没了。即使在对文件进行编辑之前,也必须知道如何在命令行接口读取这些文本文件。

3.3.1 文本流的读命令

前面已经学习了cd、ls和pwd用于处理Linux文件的命令。加上find和locate命令,我们已掌握了如何确定所需要文件的位置。

现在该是如何读取、复制和移动文件的时候了。大多数Linux配置文件都是文本文件,Linux编辑器就是文本编辑器。Linux命令就是为读取文本文件而设计的。为确定当前目录中文件的类型,可以试试file *命令。

1. cat命令

最简单的文本文件读取命令是cat。cat filename命令可翻页显示filename文件的内容。它也可以处理多个文件名。它把多个文件的内容合并在一起,并将其连续输出到屏幕上。也可以把输出结果重定向到自己喜欢的文件名中,这将在3.1.5一节“文本流和命令重定向”中讨论。

2. less和more命令

大文件需要一个可以让用户悠闲自在浏览文件内容的命令,它们就是more和less。用more filename命令可以翻页显示文本文件的内容,每次一个屏幕从头到尾显示。使用less filename命令,我们可以用PAGE UP、PAGE DOWN和方向键向前或向后翻页查看同样的文本。这两个命令都支持vi模式搜索。

less和more命令不修改文件,所以是翻页显示大文本文件(如错误日志)或者在大文本文件中搜索项目的极佳方法。例如,要浏览基本的/var/log/messages文件,可执行下面的命令:

        # less /var/log/messages

然后就可以翻页显示日志文件以搜索文件中的重要信息。接下来可以用向前的斜杠(/)和问号在文件中向前或向后搜索。例如,当我们执行了上述命令后,就会出现如图3-3所示的窗口。

图3-3 less命令和/var/log/messages中的内容

例如,要在文件中向前搜索“IPv4 tunneling”,只要在命令行窗口的底部输入下面的内容即可:

        /IPv4 tunneling

如果要按相反的方向搜索,则只要把/改为?即可。

less命令有几个功能是more和cat这两个命令所没有的。它可以读取用Gzip格式压缩的文本文件,通常这种文件的扩展名为.gz。例如,许多在shell环境执行的标准命令的man文档都保存在/usr/share/man/manl目录中。这个目录中的所有文件都被压缩成.gz格式的文件。但用less命令不需要解压就可以读取这些文件的内容。

这就让我们想起man命令的使用。换言之,下面两个命令在功能上是等效的:

        # man cat
        # less /usr/share/man/man1/cat.1.gz

3. head和tail命令

head和tail是两个不同的命令,但是它们的用法完全相同。默认情况下,head filename命令显示一个文件的前10行内容。tail filename命令显示文件的最后10行内容。可以用-nxy开关选项定义需要显示的行数。例如,tail -n 15 /etc/passwd命令显示/etc/passwd文件的最后15行内容。

tail命令特别有用,可用于解决执行过程中发生的问题。例如,如果登录一直失败,则下面的命令可以监测相关文件,当记录下新的日志条目时在屏幕上显示出来:

        # tail -f /var/log/secure

3.3.2 处理文本流的命令

文本流就是数据的流动。例如,cat filename命令把来自filename的数据流输出到终端上。当这些文件变大时,最好先用过滤器命令对这些流进行处理。

为此,Linux引入了几个简单的命令帮助我们搜索、检查和对文件的内容排序。有些特殊的文件,它们包含其他文件。这些容器文件的一部分俗称为打包工具(tarball)。

实际经验

打包(tarball)是一种发布Linux程序包的常用方法。它们通常以一个压缩格式发布程序包,如.tar.gz或.tgz文件扩展名,它们把程序包都集中到一个文件中。

1. sort命令

可以用多种方法对文件的内容进行排序。默认情况下,sort命令按照字母顺序将文件内容按每行首字符进行排序。例如,sort /etc/passwd命令把所有用户(包括与某些特定服务有关的用户)按用户名排序。

2. grep命令

grep命令使用搜索词搜索文件。它返回包含此搜索词的整行内容。例如,grep "Michael Jang"/etc/passwd就会在/etc/passwd文件中查找到本书作者的名字。

在grep命令中可使用正则表达式。正则表达式十分强大,可指定复杂的搜索模式。表3-2中列出了在正则表达式中具有特殊意义的一些字符。如果希望丢弃元字符的特殊意义,而纯粹照字面使用,需要在元字符的前面加上反斜杠(\)。

表3-2 正则表达式中的特殊字符

grep命令支持一些有用的开关选项。为使搜索区分大小写,可以在命令行传递-i选项。-E选项支持使用扩展的正则表达式语法。另外一个值得注意的开关选项是-v,它可反转匹配逻辑。也就是说,它告诉grep,只选择不能匹配正则表达式的那些行。

举个例子。假设只想选择/etc/nsswitch.conf中不为空、且不包含注释(即不以#字符开头)的那些行。这可以通过执行下面的命令实现:

        # grep -v '^$' /etc/nsswitch.conf | grep -v '^#'

注意,第一个grep命令选择了全部不为空的行(匹配空行的正则表达式为^$,也就是说,行尾紧跟行首)。然后,输出通过管道发送给第二个grep命令,它排除了所有以#字符开头的行。

使用一个grep命令和-e开关,可以得到同样的结果,-e开关允许在同一命令中指定多个搜索模式:

        # grep -v -e '^$' -e '^#' /etc/nsswitch.conf

关于正则表达式的更多信息,可输入man 7 regex查看。

3. diff命令

diff是一个非常有用的命令,它可以找出两个文件的差别。如果已经使用过本章后面将要介绍的Network Manager Connections Editor工具,此工具会修改/etc/sysconfig/network-scripts目录中的诸如ifcfg-eth0文件的内容。

如果已经备份了ifcfg-eth0文件,则用diff命令可以找出两个文件的区别。例如,下面的命令可找出/root目录中的ifcfg-eth0与/etc/ sysconfig/ network-scripts目录中ifcfg-eth0文件的差别:

        # diff /root/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0

4. wc命令

wc是单词统计(word count)的缩写符。它可以返回一个文件中的行数、单词数和字符数。wc命令很容易使用,例如,wc -w filename命令返回此文件的单词数。

5. sed命令

sed命令是流编辑(stream editor)的缩写符,用于搜索并修改文件中指定的单词甚至文本流。例如,下面的命令把opsys文件每一行的第一个Windows改为Linux,并把结果保存到newopsys文件中:

        # sed 's/Windows/Linux/' opsys > newopsys

但这还不是sed的全部功能。如果在opsys文件中的一行有不止一个Windows,这个命令不会替换第二个Windows,但是增加“全局”后缀符(g)就可以做到这一点:

        # sed 's/Windows/Linux/g' opsys > newopsys

下面的示例确保所有用writable=yes指令配置的Samba共享参数都被改为writable=no:

        # sed 's/writable = yes/writable = no/g' /etc/samba/smb.conf > ~/smb.conf

当然,在原来的/etc/samba/smb.conf文件被覆盖之前,最好先浏览/root/smb.conf文件中的内容。

6. awk命令

awk命令是以它的开发者命名的(Aho、Weinberger和Kernighan),它更像是一个完整的编程语言,而不只是一条命令。它用一个关键字确定所在的行,可以读取这一行中的从指定列开始的内容。一个常用的示例是它作用于/etc/passwd文件。例如,下面这个命令输出/etc/passwd中包含“mike”的每个用户的第四个字段(组ID):

        # awk -F : '/mike/ {print $4}' /etc/passwd

3.3.3 在控制台编辑文本文件

RHCSA认证目标的最初版本明确要求考生需要掌握vim编辑器的使用。严格来说,无论用哪个文本编辑器来编辑文本文件都没有关系。但我们认为你应该了解vim编辑器的用法,显然Red Hat的许多人也同意这个观点。vim编辑器是vi编辑器改进版(vi improved)的缩写。安装后可以用vi命令启动vim编辑器。从现在开始我们就用vi代表这个编辑器。

我们认为每个系统管理员都应对vi有一个基本的了解。虽然emacs也是个很好的选择,但是vi可以帮助我们挽救一个有故障的系统。如果你曾经用紧急引导媒介恢复一个重要的配置文件,则vi可能是唯一可用的编辑器。

虽然RHEL 7也包含了对一个更加直观的nano编辑器的访问,但是掌握vi命令可以帮助我们更快速地搜索和编辑文本文件的关键部分。虽然RHEL急救媒介(rescue media)提供了更多的基于控制台的编辑器,但是vi是Linux中功能最丰富、最高效的编辑器之一。

应该掌握vi的两种基本模式:命令模式和插入模式。当我们用vi打开一个文件时,它就处于命令模式。有些命令会启动插入模式。打开一个文件很容易,用vi filename命令即可。图3-4是vi命令打开/etc/nsswitch.conf文件的一个示例。

图3-4 用vi编辑/etc/nsswitch.conf文件

下面是对vi编辑器的最简单的介绍。要想掌握更多的内容有很多图书可以选择,也可以用vimtutor命令得到一个vi教程。

1. vi的命令模式

处于命令模式时,除了编辑外可以对一个文本文件做任何操作。在命令模式下可以使用的选项非常多且经常变化,用几本书也描述不完。归纳起来vi命令的选项可分为7类:

打开 要在命令行接口用vi编辑器打开一个文件,可执行vi filename命令。

搜索 对于向前搜索,在反斜杠(/)后面加上搜索词。记住,Linux是大小写敏感的,因此要用/Michael(而不是/michael)命令来搜索/etc/passwd文件中的“Michael”。向后搜索要用问号(?)。

写入 保存编辑后的结果要用w命令。可以结合其他命令,如:wq写入文件并退出vi。

关闭 用:q命令退出vi编辑器。

放弃 放弃任何修改要用:q!命令。

编辑 可以用vi的很多命令编辑文件。例如,x删除当前光标所在的字符;dw删除当前光标所在单词;dd删除当前行。记住,yy把当前行复制到缓冲区中,p把字符复制到缓冲区中,u取消前一次的修改。

插入 有很多命令可以启动插入模式。按i在当前位置开始插入文本,按o在光标当前位置的下方插入一个空行。

2.基本的文本编辑

在现在的Linux系统中,用vi编辑文件是一件非常容易的事。只需要常用的导航键(方向键、PAGEUP和PAGEDOWN),然而用i和o等基本命令启动vi的插入模式,直接在文件中输入新的内容。

当结束插入模式时,按ESC键返回到命令模式。这时可以保存、放弃编辑结果,并退出vi程序。

实际经验

vi命令有几个专用的版本。vipw、vigw和visudo命令分别用来编辑 /etc/passwd、/etc/group和/etc/sudoers文件。vipw -s和vigr -s命令分别编辑/etc/shadow和/etc/gshadow文件。

3.3.4 练习3-1:用vi创建一个新用户

在这个练习中,我们通过vi文本编辑器编辑/etc/passwd文件以创建一个新用户。虽然创建Linux新用户还有其他方法,这个练习可以用来验证使用vi和命令行接口的熟练程度。

(1)打开Linux命令行窗口。以root用户登录并输入vipw命令。这个命令用vi编辑器打开/etc/passwd文件。

(2)导航到文件的末尾。在命令模式下移动到文件末尾有很多办法,包括使用DOWN ARROW键、PAGEDOWN键,或者G命令。

(3)找到普通用户所在的一行。如果刚刚新建一个用户,则应该文件的最后一行,其UID为1000或更高。如果不存在普通用户,则找到第一行,它肯定与root系统管理员有关,这一行在第3列和第4列有数字0。

(4)复制这一行内容。如果已经熟悉vi的操作,则应该知道如何用yy命令将整行内容复制到缓冲区中。这就是把整行内容“拖到”缓存中。然后用p命令把这一行内容粘贴到其他位置,可以粘贴任意多次。

(5)修改用户名、用户ID和组ID以及用户全名和新用户的主目录。有关它们的详细信息请阅读第8章内容。例如,在下面的示例中,这些内容对应于tweedle、1001、1001、Tweedle Dee和/home/tweedle。确保用户名与主目录对应。

(6)按下ESC键返回到命令模式,用:w命令保存文件,然后用:q退出vi(在vi中可以合并使用这两个命令。下次修改后要保存文件并且退出vi可以用:wq命令)。

(7)应该看到如下的消息:

        You have modified /etc/passwd.
        You may need to modify /etc/shadow for consistency.
        Please use the command 'vipw -s' to do so.

该信息可能会被忽略,因为第8步会在etc/shadow文件中添加合适的信息,但你无须直接修改/etc/shadow。

(8)以root用户身份执行passwd newuser命令。给新用户设置一个口令。在本例中,这个新用户是tweedle。

(9)过程还没有结束,每个用户还需要一个组。因此执行vigr命令。重复前面介绍的把某一合适的行复制到文本的末尾的步骤。注意,组名和组ID通常与用户名和用户ID相同。

(10)只需要修改新增加一行中的组名和组ID。根据前面示例的信息,组名为tweedle,组ID为1001。

(11)重复前面提到的:wq命令保存文件并且关闭vi程序。

(12)注意以下信息:

        You have modified /etc/group.
        You may need to modify /etc/gshadow for consistency.
        Please use the command 'vigr -s' to do so.

(13)如前所述,用vigr -s命令打开/etc/gshadow文件。我们注意到这个文件的内容不多。找到合适一行进行复制后,就只需要修改组名。

(14)重复刚才提到的:wq命令,保存文件并关闭vi。实际上,我们会看到一个信息,表示这个文件是只读的。因此,要保存到这种“只读文件”中必须用:wq!命令,这会覆盖掉当前的设置。

(15)正确建立新用户还需要另外几个步骤。这些步骤与新用户的主目录、/etc/skel目录中的标准文件有关。详细内容请阅读第8章。

3.3.5 如果不喜欢vi

默认情况下,当我们执行edquota和crontab命令时,系统都会用vi编辑器打开相应的quota和cron作业配置文件。如果很不喜欢用vi,则用下面的命令可以改变默认编辑器:

        # export EDITOR=/bin/nano

如果想改变所有用户的默认编辑器,则要把前面这一行命令添加到/etc/environment配置文件中。不是非得用vi编辑器修改/etc/environment文件不可,下面的命令可以把刚才提到的命令添加到/etc/environment文件的末尾。

        # echo 'export EDITOR=/bin/nano' >> /etc/environment

由于nano编辑器相当直观,如图3-5所示,因此本书不提供此编辑器的用法。完整的使用手册可从www.nano-editor.org/dist/v2.3/nano.html下载。

图3-5 用nano编辑器打开/etc/nsswitch.conf文件

如果喜欢用其他编辑器如emacs,也可做类似修改。

3.3.6 用GUI工具编辑文本文件

毫无疑问,Red Hat考试对使用GUI的用户已经越来越友好。曾经有一段时间,RHCSA认证目标包括了gedit文本编辑器。比较传统的Linux系统管理员可能会对此感到恐惧(gedit编辑器因此从RHCSA考试中删除)。

如果系统没有安装gedit编辑器,可执行yum install gedit命令安装gedit。一旦安装了gedit,单击Applications | Accessories | gedit就可以启动它。由于它是一个直观的GUI文本编辑器,因此它的用法很简单。不要纠缠于编辑器,它们只不过是考试和实际工作的一个工具而已。

但如果要在远程系统上编辑配置文件,我们可能无法访问远程系统上的gedit,特别当远程系统还没有安装gedit时。当然,我们可以在任何Red Hat系统上安装该GUI工具,并使用X转发。但是许多管理员建立的虚拟机是不带GUI的,目的是为了节省空间并降低安全风险。