目录
第十章 文件操作
1. 文件系统
在Linux(以及所有类似UNIX的操作系统)中,通常说“一切都是文件”,或者至少如此。这意味着无论是处理普通数据文件和文档,还是处理声卡和打印机之类的设备,您都可以通过相同的输入/输出(I / O)操作与它们进行交互。这简化了打开“文件”并执行正常的操作,例如读取文件并在文件上写入。
在许多系统(包括Linux)上,文件系统的结构像一棵树。该树通常被描绘为倒置的,并且从最常被称为根目录的根目录 开始,该根目录标志着分层文件系统的开始, 有时也称为主干,或简单地由 /表示。根(root)目录 / 和 root用户的目录是不一样的(英文语义)。分层文件系统在路径(目录名称)中还包含其他元素,这些元素之间用正斜杠(/)分隔,如/ usr / bin / emacs中所示,其中最后一个元素是实际文件名。

Linux支持由Linux开发人员明确创建的多种本机文件系统类型,例如:
- ext3
- ext4
- squashfs
- btrfs.
它还提供了在其他外部操作系统上使用的文件系统的实现,例如来自以下操作系统的文件系统:
- Windows ( ntfs , vfat )
- SGI(xfs)
- IBM(jfs)
- MacOS(hfs,hfs +)
还支持许多较旧的旧文件系统,例如FAT 。
通常,一台机器上会使用多个文件系统类型,这基于诸如文件大小,文件被修改的频率,文件所位于的硬件类型以及所需的访问速度等因素的考虑。常用的最高级文件系统类型是日记记录类型:ext4,xfs,btrfs和jfs。这些具有许多最新功能和高性能,并且很难被意外损坏。
如前所述,Linux系统上的每个文件系统都占用一个硬盘分区。分区有助于根据所包含数据的种类和用途来组织磁盘的内容。例如,运行系统所需的重要程序通常保存在一个单独的分区(称为root或/)上,而不是包含该系统的常规用户(/ home)拥有的文件的分区。此外,在Linux的正常运行过程中创建和销毁的临时文件可能位于专用分区上。通过类型和可变性进行这种隔离的一个优势是,当特定分区上的所有可用空间都用完时,系统仍可以正常运行。
图中显示了名为gparted的工具内容,该工具显示了具有三个操作系统的系统上的分区布局:Windows 10,RHEL 7和Ubuntu 18.04。

在开始使用文件系统之前,需要在安装点将其安装到文件系统树中。这只是要附加(挂载)文件系统的目录(可以为空,也可以不为空)。有时,如果目录不存在,则可能需要创建该目录。
警告:如果在非空目录上挂载文件系统,该目录的先前内容将被掩盖,并且在卸载该文件系统之前不可访问。因此,安装点通常是空目录。

该 mount 指令用于安装文件系统(可以是本地计算机或,我们将讨论在网络上)的文件系统树中的某处。基本参数是设备节点和安装点。例如,
sudo mount /dev/sda5 /home
将与/ dev / sda5设备节点关联的磁盘分区中包含的文件系统附加到/ home 挂载点的文件系统树中。除了设备节点以外,还有其他方法可以指定分区,例如使用磁盘标签或UUID。
要卸载该分区,命令为:
sudo umount /home
注意命令是 umount,不是unmount!除非以其他方式配置了系统,否则只有root用户(以root用户登录或使用sudo登录)有权运行这些命令。如果希望它在每次系统启动时自动可用,则需要相应地编辑/ etc / fstab(名称是文件系统表的缩写)。查看该文件将为您显示所有预配置文件系统的配置。man fstab将显示如何使用此文件以及如何配置它。
键入 不带任何参数的mount将显示当前所有已挂载的文件系统。命令df -Th(无磁盘)将显示有关已挂载文件系统的信息,包括文件系统类型,以及有关当前使用和可用空间的使用情况统计信息。

通常有必要在物理系统之间共享数据,这些物理系统可以位于Internet可以到达的相同位置或任何位置。网络(有时也称为分布式)文件系统可以将所有数据都放在一台计算机上,也可以分散在一个以上的网络节点上。可以在各台机器上本地使用各种不同的文件系统。网络文件系统可以看作是各种类型的低级文件系统的组合。

许多系统管理员将远程用户的主目录安装在服务器上,以使他们可以跨多个客户端系统访问相同的文件和配置文件。这使用户可以登录到不同的计算机,但仍然可以访问相同的文件和资源。最常见的此类文件系统简称为NFS(网络文件系统)。它具有很长的历史,最早由Sun Microsystems开发。另一个常见的实现是CIFS(也称为SAMBA),它起源于Microsoft。我们将把注意力集中在对NFS的关注上。
现在,我们将详细介绍如何在服务器上使用NFS。
在服务器计算机上,NFS使用守护程序(Linux中的内置网络和服务进程),并在命令行中通过键入以下命令来启动其他系统服务器:
sudo systemctl start nfs
文本文件/ etc / exports包含主机愿意通过NFS与其他系统共享的目录和权限。该文件中的一个非常简单的条目可能如下所示:
/projects * .example.com(rw)
此项允许使用具有读写(rw)权限的NFS挂载目录/projects,并与example.com域中的其他主机共享。正如我们将在下一章中详细介绍的那样,Linux中的每个文件都具有三种可能的权限:读取(r),写入(w)和执行(x)。
修改/ etc / exports文件后,可以使用exportfs -av命令通知Linux有关允许使用NFS远程挂载的目录的信息。您也可以使用sudo systemctl restart nfs,但这比较慢,因为它会暂停NFS一段时间,然后再重新启动。要确保 每次引导系统时都启动NFS 服务,请键入 sudo systemctl enable nfs.

在客户机上,如果希望在系统引导时自动安装远程文件系统,则可以修改/ etc / fstab文件来完成此操作。例如,客户端的/ etc / fstab文件中的条目可能如下所示:
servername:/projects /mnt/nfs/projects nfs defaults 0 0
您还可以通过直接使用mount命令来挂载远程文件系统而无需重新引导或一次性挂载:
sudo mount servername:/projects /mnt/nfs/projects
请记住,如果未修改/ etc / fstab ,则下次系统重新启动时将不会出现此远程安装。此外,如果NFS服务器在引导时不处于活动状态,则可能要在fstab中使用nofail选项。

2. 文件系统架构
在本节中,您将学习识别和区分Linux中最重要的目录。我们从普通用户的主目录空间开始。
每个用户都有一个主目录,通常位于/home下。现代Linux系统上的/root(“ slash-root”)目录仅是root用户(或超级用户或系统管理员帐户)的主目录。在多用户系统上,/home目录基础结构通常作为单独的文件系统安装在其自己的分区上,甚至通过NFS远程导出(共享)在网络上。有时,您可以根据用户的部门或职能对其进行分组。然后,您可以在/home目录下为每个组创建子目录。例如,学校可能使用以下内容来组织/home:
/ home / faculty /
/ home / staff /
/ home / students /

在/bin中目录包含可执行二进制码,用于启动系统或在单用户模式必需的命令,并且通过所有系统用户所需的必要的命令,如cat, cp, ls, mv, ps和 rm。

同样,/ sbin 目录用于与系统管理相关的基本二进制文件,例如 fsck 和 shutdown。

对于系统启动或以单用户模式运行不是必需的命令(理论上),这些命令位于/ usr / bin 和/ usr / sbin 目录中。之前这样做是为了使 / usr 可以作为一个单独的文件系统挂载,可以在系统启动的后期甚至通过网络挂载。但是,如今大多数人发现这种区别已经过时了。实际上,已经发现许多发行版无法通过这种分离启动,因为这种方式已经很长时间没有使用或测试了。因此,在一些最新的Linux发行版中, / usr / bin 和 / bin 实际上就象征性的链接在一起,/ usr / sbin和/ sbin也是如此。
某些文件系统,像一个安装在 / proc中,被称为伪文件系统,因为他们没有永久存在磁盘上的任意位置。
的/ proc文件系统包含允许观看不断变化的内核数据虚拟文件(仅在存储器中存在的文件)。该文件系统包含模仿内核结构和配置信息的文件和目录。它不包含实际 文件,但包含运行时系统信息,例如系统内存,已安装的设备,硬件配置等。/proc中的一些重要文件包括:
/proc/cpuinfo
/proc/interrupts
/proc/meminfo
/proc/mounts
/proc/partitions
/proc/version
/proc 也具有子目录,包括:
/proc/<Process-ID-#>
/proc/sys
第一个示例显示在系统上运行的每个进程都有一个目录,其中包含有关该目录的重要信息。第二个示例显示了一个虚拟目录,其中包含有关整个系统的很多信息,尤其是其硬件和配置。/ proc文件系统非常有用,因为它报告的信息仅根据需要收集,而无需存储在磁盘上。

所述的/ dev目录包含的设备节点,大多数硬件和软件设备中使用的,除了网络设备中的类型伪的文件。该目录是:
- 未挂载时在磁盘分区上为空
- 包含由udev系统创建的条目,该系统在Linux上创建和管理设备节点,并找到设备时动态创建它们。/dev目录包含以下项目:
- / dev / sda1 (第一个硬盘上的第一个分区)
- / dev / lp1(第二台打印机)
- / dev / random (随机数的来源)

/var目录包含有望在规模和内容的系统改变运行文件(VAR代表变量),如以下目录中的条目:
- 系统日志文件:/ var / log
- 软件包和数据库文件:/ var / lib
- 打印队列:/ var / spool
- 临时文件:/ var / tmp。
/var目录可以放在其自己的文件系统上,以便可以容纳文件的增长,并且文件大小不会严重影响系统。也可以在/ var下找到诸如/ var / ftp(FTP服务)和/ var / www(HTTP Web服务)之 类的网络服务目录。

/etc目录是系统配置文件的主目录。尽管有一些可执行脚本,但它不包含二进制程序。例如,/ etc / resolv.conf 告诉系统要在网络上到达哪里以获取主机名到IP地址的映射(DNS)。在/ etc目录中可以找到诸如passwd, shadow 和 group 用于管理用户帐户的文件。尽管某些发行版本在/ etc下拥有自己的广泛基础结构 (例如,Red Hat和SUSE使用/ etc / sysconfig),但是随着systemd的出现,当今发行版本之间的统一性更高。
请注意, / etc 用于系统范围的配置文件,只有超级用户才能在此处修改文件。特定于用户的配置文件始终位于其主目录下。

/boot目录包含启动系统所需的一些基本文件。对于系统上安装的每个备用内核,都有四个文件:
- vmlinuz
引导所需的压缩Linux内核。 - initramfs
引导所需的初始ram文件系统,有时称为initrd,而不是initramfs。 - config
内核配置文件,仅用于调试和簿记。 - System.map
内核符号表,仅用于调试。
这些文件中的每个文件都在其名称后附加了一个内核版本。
还可以在/ boot目录下找到Grand Unified Bootloader(GRUB)文件,例如/boot/grub/grub.conf或/boot/grub2/grub2.cfg。

上图显示了/ boot 目录的示例列表,该目录取自具有多个已安装内核的RHEL 7系统,包括发行版提供的和自定义编译的内核。名称会有所不同,并且在不同的发行版上,情况可能会有所不同。
/ lib在 / bin和 / sbin中包含基本程序的库(应用程序共享的通用代码,它们是运行它们所需的)。这些库文件名以 ld或 lib开头。 例如,/ lib/libncurses.so.5.9。
其中大多数是所谓的动态加载库(也称为共享库或共享对象(SO))。在某些Linux发行版中,存在一个/ lib64 目录,其中包含64位库,而/ lib 包含32位版本。
在最近的Linux发行版中,可以找到:

即就像/ bin 和/ sbin一样,目录指向/ usr下的目录。
内核模块(可以在不重新启动系统的情况下加载和卸载)(内核代码,通常是设备驱动程序)位于/ lib / modules / <kernel-version-number>中。
人们经常使用可移动媒体,例如USB驱动器,CD和DVD。为了使资料可以通过常规文件系统访问,必须将其安装在方便的位置。大多数Linux系统均已配置,因此当系统发现已插入某些内容时,会自动装入所有可移动介质。
之前,这是在/ media 目录 下完成的 ,但是现代Linux发行版将这些安装点放在/ run 目录下。例如,带有标签“myusbdrive”的用户名“student”的USB笔驱动将安装在 / run / media / student / myusbdrive上。
/mnt 因为UNIX初期临时挂载文件系统目录中已被使用。这些文件可以是可移动介质上的文件,但更常见的是带有NFS的网络文件系统,这些文件系统通常不会挂载。或者这些可以是临时分区,也可以是所谓的伪装成分区的文件的回送文件系统。
在根目录下还有一些其他目录:

/usr目录树从理论上讲包含非必需的程序和脚本(从某种意义上说,它们在最初启动系统时不需要使用),并且至少具有以下子目录:

3. 比较文件和文件类型
现在您已经了解了文件系统及其结构,现在让我们学习如何管理文件和目录。
diff 用于比较文件和目录。这个经常使用的实用程序具有许多有用的选项(请参阅: man diff),包括:

若要比较两个文件,请在命令提示符下键入diff [options] <filename1> <filename2>。diff用于文本文件;对于二进制文件,可以使用 cmp。
在本节中,您将学习用于比较文件以及如何将补丁应用于文件的其他方法。
您可以使用diff3一次比较三个文件,该文件使用一个文件作为其他两个文件的参考基础。例如,假设您和同事都对同时工作的同一文件进行了修改。diff3 可以基于您都使用的通用文件来显示差异。diff3的语法 如下:
diff3 MY-FILE COMMON-FILE YOUR-FILE
该图显示了diff3的用法 。

使用补丁分发了对源代码和配置文件的许多修改,毫无疑问,补丁程序会应用这些 补丁。修补程序文件包含将文件的较旧版本更新为新版本所需的增量(更改)。修补程序文件实际上是通过使用正确的选项运行diff产生的,如下所示:
diff -Nur originalfile newfile > patchfile
仅分发补丁程序比分发整个文件更为简洁高效。例如,如果在包含1000行的文件中仅需要更改一行,则补丁文件将只有几行长。

要应用补丁,您可以执行以下两种方法之一:
patch -p1 < patchfile
patch originalfile patchfile
第一种用法更为常见,因为它经常用于将更改应用于整个目录树,而不仅仅是第二个示例中的一个文件。要了解-p1选项以及其他许多选项的用法 ,请参见patch的手册页。
在Linux中,文件扩展名通常不会像在其他操作系统中那样进行分类。不能假定名为file.txt的文件是文本文件,而不是可执行程序。在Linux中,文件名通常比系统本身对系统用户更有意义。实际上,大多数应用程序直接检查文件的内容以查看文件的类型,而不是依赖扩展名。这与Windows处理文件名的方式非常不同,在Windows中,文件名以.exe结尾的文件表示可执行的二进制文件。可以通过使用文件实用程序来确定文件的真实性质。对于作为参数指定的文件名,它将检查内容和某些特征,以确定文件是纯文本文件,共享库,可执行程序,脚本还是其他文件。

4. 数据备份和数据压缩
您可以通过多种方法来备份数据甚至整个系统。这样做的基本方法包括使用cp进行简单复制以及使用更可靠的rsync。两者都可以用于同步整个目录树。但是,rsync效率更高,因为它检查要复制的文件是否已经存在。如果文件存在并且大小或修改时间没有变化,则rsync将避免不必要的复制并节省时间。此外,由于rsync仅复制实际上已更改的文件部分,因此它可以非常快。
cp只能与本地计算机上的目标之间来回复制文件(除非要与使用NFS挂载的文件系统进行复制),但是 rsync也可以用于将文件从一台计算机复制到另一台计算机上。位置以 target:path形式指定,其中 target可以为 someone @ host形式。该someone @ 部分是可选的,如果远程用户是来自本地用户的不同使用。
当将一个目录树递归复制到另一个目录树时, rsync非常有效,因为只有差异会通过网络传输。通常使用 -r选项递归遍历目录树,将目标目录树与源目录树同步,从而复制列出的源目录下的所有文件和目录。
rsync 是一个非常强大的实用程序。例如,备份项目目录的一种非常有用的方法可能是使用以下命令:
rsync -r project-X archive-machine:archives/project-X
请注意,rsync 可能具有很大的破坏性!意外的滥用会由于无意间将更改复制到不需要的地方而对数据和程序造成很大的伤害。注意指定正确的选项和路径。强烈建议您先测试您的rsync 使用命令 -dry-run 选项,以确保它提供了你想要的结果。
要在命令提示符下使用 rsync ,请键入rsync sourcefile destinationfile,其中一个文件可以位于本地计算机上,也可以位于网络计算机上;sourcefile的内容 将被复制到destinationfile。
选项的良好组合如下所示:
rsync --progress -avrxH --delete sourcedir destdir
通常会压缩文件数据以节省磁盘空间并减少通过网络传输文件所需的时间。
Linux使用多种方法来执行此压缩,包括:

这些技术的压缩效率(节省多少空间)以及压缩所需的时间有所不同。通常,更有效的技术需要更长的时间。减压时间在不同方法之间变化不大。另外,tar 工具通常用于对档案中的文件进行分组,然后立即压缩整个档案。
gzip 是最常用的Linux压缩实用程序。它压缩得非常好并且非常快。下表提供了一些用法示例:

bzip2的语法与gzip相似,但是它使用不同的压缩算法,并且产生的文件要小得多,但花费的时间却更长。因此,它更有可能用于压缩较大的文件。常见用法的示例也类似于 gzip:

xz 是Linux中使用的最节省空间的压缩实用程序,现在用于存储Linux内核的存档。再次,它以较低的压缩速度换来更高的压缩比。压缩文件以.xz扩展名存储。 一些用法示例:

在Linux中,该zip 程序通常不用于压缩文件,但通常需要使用zip程序来检查和解压缩来自其他操作系统的档案。仅当从Windows用户获得压缩文件时,才在Linux中使用它。这是一个旧程序。

从历史上看,tar 代表“磁带存档”,用于将文件存档到磁带。它允许您从通常称为tarball的存档文件中创建或提取文件。同时,您可以选择在创建归档文件时进行压缩,并在提取其内容时进行解压缩。以下是一些使用tar的示例:

您可以将归档和压缩阶段分开,如下所示:
tar cvf mydir.tar mydir ; gzip mydir.tar
gunzip mydir.tar.gz ; tar xvf mydir.tar
但这速度较慢,且创建不需要的中间.tar文件来浪费空间。
为了演示gzip, bzip2和 xz的相对效率 ,以下屏幕截图显示了使用这三种方法压缩纯文本文件目录树(来自内核源的 include 目录)的结果。

这表明,随着压缩系数的增加,CPU时间也会增加(例如,生成较小的存档会花费更长的时间)。
dd 程序是使原始磁盘空间复制非常有用的。例如,要备份主引导记录(MBR)(磁盘上的第一个512字节扇区,其中包含描述该磁盘上的分区的表),可以键入:
dd if = / dev / sda of = sda.mbr bs = 512 count = 1
警告!
输入:
dd if = / dev / sda of = / dev / sdb
要将一个磁盘的副本复制到另一个磁盘上,将删除第二个磁盘上先前存在的所有内容。
在第二个磁盘设备上创建了第一个磁盘设备的精确副本。
不要尝试上面写的这个命令,因为它会擦除硬盘!
dd的名称确切地 是一个经常被争论的项目。数据定义一词是最流行的理论,它起源于IBM早期的 历史。通常,人们开玩笑说这意味着磁盘破坏者和其他变体,例如删除数据!

时不时地存档(或备份)文件是必不可少的良好卫生习惯。您可能会键入命令,从而无意间破坏了所需的文件,而不是要进行更改。此外,虽然您的硬件被认为相当可靠,但所有设备最终都会以某种方式发生故障(即使这只是意外的电源故障)。通常,这发生在最坏的时间。定期备份文件是一种很好的习惯。
当然,通过网络备份到外部系统或备份到外部存储(例如外部驱动器或USB记忆棒)上非常重要。在这里,我们将在同一系统上创建一个备份存档,这非常有用,但是如果驱动器发生灾难性故障,计算机被盗或小行星或火被摧毁,将无济于事。
第十一章 文本编辑器
1. 基础文本编辑器
在某些时候,您将需要手动编辑文本文件。您可能正在离线编写电子邮件,编写用于bash或其他命令解释器的脚本,更改系统或应用程序配置文件,或者为诸如C或Java的编程语言开发源代码。Linux管理员通常使用图形实用程序来创建和修改系统配置文件,从而避开了文本编辑器。但是,与直接使用文本编辑器相比,这可能更费力,并且功能上也受到限制。请注意,文字处理应用程序(包括那些属于Office套件的文字处理应用程序)并不是真正的基本文本编辑器,因为它们会添加许多额外的(通常是不可见的)格式设置信息,这些信息可能会使系统管理配置文件无法按预期使用。因此,在Linux中使用文本编辑器确实至关重要。到目前为止,您肯定已经意识到Linux充满了选择。
对于文本编辑器,有很多选择,从非常简单到非常复杂,包括:
- nano
- gedit
- vi
- emacs.

在本节中,我们将学习相对简单易学的nano和gedit编辑器。在开始之前,让我们看一些不需要编辑器的情况。
有时,您可能想创建一个简短的文件,而又不想打扰全文编辑器。此外,从脚本内使用时,即使创建更长的文件,这样做也很有用。当您在介绍bash脚本的后续章节中开始时,您无疑会发现自己在使用这种方法!如果要在不使用编辑器的情况下创建文件,则有两种标准方法可以从命令行创建一个文件并用内容填充它。
第一种是 重复使用echo:
echo line one > myfile
echo line two >> myfile
echo line three >> myfile
请注意,虽然单个大于号(>)会将命令的输出发送到文件,但其中两个(>>)会将新的输出附加到现有文件。
第二种方法是 结合使用cat和重定向:
cat << EOF > myfile
> line one
> line two
> line three
> EOF
两种技术都会在文件中包含以下几行:
line one
line two
line three
并且在脚本使用时非常有用。

有一些很明显的文本编辑器。他们不需要特殊的经验就可以学习,并且即使不是很健壮,他们实际上也很有能力。一种特别易于使用的工具是基于文本终端的编辑器nano。只需 通过提供文件名作为参数来调用nano 。您需要的所有帮助都显示在屏幕底部,您应该可以继续进行而不会出现任何问题。作为图形编辑器,gedit是GNOME桌面系统的一部分(kwrite与KDE相关联)。gedit和kwrite编辑器非常易于使用并且功能强大。它们也是非常可配置的。它们看起来很像Windows中的记事本。KDE也支持其他变量,例如kate。
nano易于使用,并且几乎不需要学习。要打开nano文件,请输入nano <filename>并按Enter。如果文件不存在,将创建它。

gedit(发音为“ g-edit”)是一种易于使用的图形编辑器,只能在图形桌面环境中运行。它在外观上与Windows中的记事本文本编辑器非常相似,但实际上功能更强大且可配置性更强,并且具有大量可用的插件来进一步扩展其功能。要在gedit中打开新文件,请在桌面菜单系统中找到该程序,或者从命令行键入gedit <filename>。如果文件不存在,将创建它。
使用gedit非常简单,不需要太多培训。它的界面由相当熟悉的元素组成。

2. 高级文本编辑器vi和emacs
在类似UNIX的系统上工作的经验丰富的开发人员和管理员几乎总是使用两个古老的编辑选项之一:vi和emacs。两者在所有发行版中都存在或容易获得,并且与其他操作系统上可用的版本完全兼容。
vi和emacs都具有基本的纯文本形式,可以在非图形环境中运行。它们还具有一个或多个具有扩展功能的图形界面形式。对于经验不足的用户,这些可能会更友好。尽管vi 和emacs对于新用户而言具有非常陡峭的学习曲线,但是当人们学会了如何使用它们时,它们将非常高效。
您需要意识到,经验丰富的用户之间关于那个编辑器比较好的战斗,这可能是非常激烈的,通常被称为一场神圣的战争。

通常,系统上安装的实际程序是vim,代表Vi IMproved,并且别名为vi。这个名字的发音是“ vee-eye”。即使您不想使用vi,也最好对它有所了解:它是几乎所有Linux发行版中都安装的标准工具。确实,有时系统上没有其他可用的编辑器。GNOME通过称为gvim的非常图形化的界面扩展了vi,而KDE提供了kvim。首先,这两种方法可能更容易使用。
使用vi时,所有命令均通过键盘输入。除非要在使用编辑器的一种图形版本时这样做,否则无需一直动手以使用鼠标或触摸板之类的指针设备。

vi 提供了三种模式,如下表所述。至关重要的是,不要忘记自己所处的模式。在不同的模式下,许多按键和命令的行为都大不相同。

下表描述了在vi中用于启动,退出,读取和写入文件的最重要命令。所有这些命令需要回车结尾。

下表描述了在vi中更改光标位置时使用的最重要的击键。行模式命令(那些以下冒号:)这些命令需要回车结尾。

下表描述了在vi中搜索文本时使用的最重要的命令。


表描述了在vi中更改,添加和删除文本时使用的最重要的命令。

键入: sh command 打开一个外部命令shell。退出shell程序后,将恢复vi 编辑会话。
键入 :! 从vi内部执行命令。该命令遵循感叹号。此技术最适合非交互式命令,例如:!wc%。键入此 命令将在文件上运行wc(字数统计)命令;字符%表示当前正在编辑的文件。

emacs编辑器是vi的流行竞争对手。与vi不同,它不适用于模式。emacs是高度可定制的,并包含大量功能。它最初是为在控制台上使用而设计的,但很快又适应了GUI的需求。emacs除了简单的文本编辑之外,还具有许多其他功能。例如,它可以用于电子邮件,调试等。
emacs并非像vi那样具有不同的命令和插入模式,而是使用CTRL 和Meta 键(Alt 或 Esc)来执行特殊命令。

emacs教程是开始学习基本emacs命令的好地方。只需在emacs中输入CTRL-h (以获得帮助),然后输入字母 t,即可 在教程中随时使用它。 具体的可以自行查找资料。
第十二章 用户环境
1. 账户,用户和用户组
如您所知,Linux是一个多用户操作系统,这意味着多个用户可以同时登录。
- 要标识当前用户,请键入whoami
- 要列出当前登录的用户,请输入 who
给who的选择将更加详细的信息。 -a

在Linux中,命令shell程序(通常为bash)使用一个或多个启动文件来配置用户环境。在/etc目录下的所有用户定义的全局设置,同时在用户的主目录初始化文件可以覆盖全局设置。
启动文件可以在每个命令外壳中执行用户想要执行的任何操作,例如:
- 自定义提示
- 定义命令行快捷方式和别名
- 设置默认文本编辑器
- 设置查找可执行程序的路径

标准规定是,当您首次登录Linux时,将读取并评估/ etc / profile,然后按照列出的顺序搜索以下文件(如果存在):
- 〜/ .bash_profile
- 〜/ .bash_login
- 〜/ .profile
〜/.表示用户的主目录。Linux登录shell将评估首先遇到的启动文件,而忽略其余启动文件。这意味着,如果找到〜/ .bash_profile,它将忽略〜/ .bash_login和〜/ .profile。不同的发行版可能使用不同的启动文件。
但是,每次创建新的shell程序或终端窗口等时,都不会执行完整的系统登录;仅读取和评估名为 〜/ .bashrc文件的文件。尽管未与登录外壳一起读取和评估此文件,但是大多数发行版和用户都从三个用户拥有的启动文件之一中包含〜/ .bashrc 文件。
最常见的是,用户仅在〜/ .bashrc操作,因为每次启动新命令行shell或从终端窗口启动另一个程序时都会调用〜/ .bashrc,而仅当用户首次登录时才读取和执行其他文件。系统。
最近的发行版有时甚至没有.bash_profile或 .bash_login(Ubuntu),有些甚至只是包含.bashrc而已 。

您可以创建自定义命令或通过创建别名来修改现有命令的行为。通常,这些别名放置在〜/ .bashrc文件中,因此您创建的任何命令Shell都可以使用它们。unalias 删除别名。
键入不带参数的alias 将列出当前定义的别名。

请注意,等号两边不应有任何空格,并且如果别名定义包含任何空格,则需要在单引号或双引号中放置别名。
所有Linux用户都被分配了唯一的用户ID(uid),它只是一个整数;普通用户的uid开头为1000或更大。
Linux使用组来组织用户。组是具有某些共享权限的帐户的集合。通过/ etc / group 文件管理组成员资格的控制,该 文件显示了组及其成员的列表。默认情况下,每个用户都属于默认或主要组。用户登录时,将为其主要组设置组成员身份,并且所有成员都享有相同级别的访问和特权。可以在组级别上修改各种文件和目录的权限。
用户还具有一个或多个组ID(gid),包括与用户ID相同的 默认ID。这些数字通过文件/ etc / passwd和/ etc / group与名称相关联。组用于建立一组具有共同兴趣的用户,以实现访问权限,特权和安全性考虑。文件(和设备)的访问权限是根据用户及其所属的组授予的。
例如, / etc / passwd 可能包含george:x:1002:1002:George Metesky:/ home / george:/ bin / bash和 / etc / group可能包含 george:x:1002

发行版具有直观的图形界面,可用于创建和删除用户和组以及操纵组成员身份。但是,从命令行或在Shell脚本中执行此操作通常很有用。只有root用户可以添加和删除用户和组。
使用useradd 完成添加新用户,而使用userdel完成删除现有用户。以最简单的形式,将为新用户bjmoose开设一个帐户 :
sudo useradd bjmoose
请注意,对于openSUSE,useradd 不在普通用户的PATH中,因此命令应为:
sudo / usr / sbin / useradd bjmoose
默认情况下,它将主目录设置为/ home / bjmoose,并用一些基本文件(从/ etc / skel复制)填充它,并在/ etc / passwd中添加一行,例如:
bjmoose:x:1002:1002 :: / home / bjmoose:/ bin / bash
并将默认shell设置为/ bin / bash。删除用户帐户就像输入userdel bjmoose 一样容易。但是,这将使/ home / bjmoose 目录保持不变。如果这是暂时的停用,这可能很有用。要在删除帐户的同时删除主目录,需要对userdel使用-r选项。
输入不带参数的id 可提供有关当前用户的信息,如下所示:
$ id
uid = 1002(bjmoose)gid = 1002(bjmoose)组= 106(fuse),1002(bjmoose)
如果给定另一个用户的名称作为参数,则id将报告有关该另一个用户的信息。

添加新组是通过groupadd完成的 :
sudo / usr / sbin / groupadd anewgroup
可以通过以下方式删除该组:
$ sudo / usr / sbin / groupdel anewgroup
使用usermod将用户添加到现有组中 。例如,您首先要查看用户已经属于哪些组:
groups rjsquirrel
bjmoose: rjsquirrel
然后添加新组:
sudo / usr / sbin / usermod -a -G anewgroup rjsquirrel
groups rjsquirrel
rjsquirrel: rjsquirrel anewgroup
这些实用程序根据需要更新 / etc / group。确保对附加使用 -a 选项,以免删除已经存在的组。groupmod可用于更改组属性,例如使用-g选项更改组ID(gid)或使用-n选项更改其名称。
从组中删除用户比较棘手。 usermod 的-G选项必须提供组的完整列表。因此,如果您这样做:
sudo / usr / sbin / usermod -G rjsquirrel rjsquirrel
groups rjsquirrel
rjsquirrel:rjsquirrel
仅 保留rjsquirrel 组。

root 帐户非常强大,并且具有对系统的完全访问权限。其他操作系统通常将此称为管理员帐户。在Linux中,通常称为超级用户帐户。在授予用户完全根访问权限之前,您必须非常谨慎。如果有的话,这很少是合理的。外部攻击通常包括用于提升到root帐户的技巧。

但是,您可以使用sudo功能为用户帐户分配更多的受限特权:
- 只是暂时的
- 仅用于特定的命令子集。
分配提升的特权时,可以使用命令 su (切换用户或替换用户)启动以其他用户身份运行的新Shell(必须输入要成为该用户的密码)。通常,该其他用户是root用户,新的Shell允许使用提升的特权,直到退出为止。使用su提升权限几乎总是一种不好的做法(对安全性和稳定性都有危险)。导致的错误可能包括从系统中删除重要文件和安全漏洞。
使用sudo授予特权的危险性较小,因此是首选。默认情况下, 必须基于每个用户启用sudo 。但是,默认情况下,某些发行版(例如Ubuntu)会为至少一个主要用户启用它,或将其作为安装选项。
在第18章:本地安全原则中,我们将详细描述和比较su 和 sudo 。
su,然后提示输入root密码。
要仅以root特权执行一个命令,请键入sudo <command>。命令完成后,您将恢复为普通的非特权用户。
sudo配置文件存储在/ etc / sudoers文件和/etc/sudoers.d/目录中。默认情况下,sudoers.d目录为空。

2. 环境变量
环境变量是具有特定值的数量,命令shell(例如bash或其他实用程序和应用程序)可以使用这些特定值。一些环境变量由系统提供预设值(通常可以覆盖),而其他一些环境变量则由用户直接设置,可以在命令行或在启动脚本和其他脚本中进行设置。
环境变量实际上只是一个字符串,其中包含一个或多个应用程序使用的信息。有许多种方法可以查看当前设置的环境变量的值。一个可以键入 set, env或 export。根据系统状态的不同, set可能比其他两种方法打印出更多的行。

默认情况下,在脚本中创建的变量仅可用于当前shell程序。子进程(子shell程序)将无法访问已设置或修改的值。允许子进程查看值需要使用export 命令。

您还可以将环境变量设置为一次性输入到命令中,如下所示:
SDIRS = s_0 * KROOT = / lib / modules / $(uname -r)/ build make modules_install
它将SDIRS和KROOT环境变量的值提供给命令 make modules_install。
HOME是一个环境变量,代表用户的主目录(或登录名)。 不带参数的 cd会将当前工作目录更改为 HOME的值。请注意,代字号(〜)通常用作 $ HOME的缩写 。因此, cd $ HOME和 cd〜是完全等效的语句。

PATH是目录(路径)的有序列表,当发出命令以查找要运行的适当程序或脚本时,将对其进行扫描。路径中的每个目录由冒号分隔(:)。空(空)目录名(或 ./)表示任何给定时间的当前目录。
- :path1:path2
- path1::path2
在该实例中:PATH1:PATH2,有第一个冒号之前空目录(:)。类似地,对于path1 :: path2在path1 和path2之间存在一个空目录。
要将私有bin 目录添加到路径前缀:
export PATH = $ HOME / bin:$ PATH
echo $ PATH
/ home / student / bin:/ usr / local / bin:/ usr / bin:/ bin / usr
环境变量SHELL 指向用户的默认命令shell程序(该程序正在处理您在命令窗口中键入的内容,通常是bash),并包含shell程序的完整路径名:
echo $SHELL
/ bin / bash
提示语句(PS)用于自定义终端窗口中的提示字符串,以显示所需的信息。
PS1是主要的提示变量,它控制命令行提示的外观。PS1中可以包含以下特殊字符 :
\ u - 用户名
\ h - 主机名
\ w - 当前工作目录
\!- 此命令的历史编号
\ d - 日期
使用它们时,它们必须用单引号引起来,如下例所示:
echo $ PS1
export PS1 ='\ u @ \ h:\ w '
student@example.com:〜$ # new prompt
student@ example.com:〜$
要还原更改,请执行以下操作:
student@example.com:〜$ export PS1 ='$'
更好的做法是先保存旧的提示,然后还原,如:
OLD_PS1 = $ PS1
更改提示,最后将其更改为:
PS1 = $ OLD_PS1

3. 回顾历史命令
bash在历史记录缓冲区中跟踪先前输入的命令和语句。您只需使用向上和向下光标键即可调用以前使用的命令。要查看以前执行的命令列表,您只需在命令行输入history 即可。
显示命令列表,最新命令显示在列表的最后。此信息存储在 〜/ .bash_history中。如果打开了多个终端,则在会话终止之前不会保存在每个会话中键入的命令。

几个关联的环境变量可用于获取有关 history 文件的信息。
- HISTFILE
历史记录文件的位置。
- HISTFILESIZE
历史记录文件中的最大行数(默认为500)。 - HISTSIZE
历史记录文件中的最大命令数。 - HISTCONTROL
命令的存储方式。 - HISTIGNORE
可以取消保存哪些命令行。
有关这些环境变量的用法的完整说明,请参见man bash。

如果要撤回历史记录列表中的命令,但又不想重复按箭头键,则可以按CTRL-R进行反向智能搜索。当您开始键入内容时,搜索将以与您输入的字母匹配的第一个命令以相反的顺序返回。通过键入更多连续的字母,可以使匹配变得越来越具体。以下是如何使用CTRL-R命令搜索命令历史记录的示例:$ ^ R(这全部发生在1行上)(反向i搜索)是:sleep 1000(在“ s';匹配的“ sleep”)$ sleep 1000(按Enter执行搜索的命令)$
下表描述了用于执行先前使用的命令的语法:

这里有更多示例:
history
- echo $SHELL
- echo $HOME
- echo $PS1
- ls -a
- ls -l /etc/ passwd
- sleep 1000
- history
$ !1 (执行上面的命令#1)
echo $SHELL
/bin/bash
$ !sl (执行最近一条以“ sl”开头的命令)
sleep 1000
您可以使用键盘快捷键快速执行不同的任务。下表列出了其中一些键盘快捷键及其用法。请注意,“热键”的大小写无关紧要,例如,执行CTRL-a与执行CTRL-A相同。

4. 文件权限
在Linux和其他基于UNIX的操作系统中,每个文件都与作为所有者的用户相关联。每个文件还与一个组(所有用户的一个子集)相关联,该组对该文件感兴趣并具有某些权利或权限:读取,写入和执行。
以下实用程序涉及用户和组的所有权和权限设置:

文件具有三种权限:读取(r),写入(w),执行(x)。这些通常用 rwx表示。这些权限影响三组所有者:用户/所有者(u),组(g)和其他(o)。
因此,您具有以下三个权限组,分为三个权限:
rwx:rwx:rwx
u:g:o
有多种使用chmod的方法。例如,要授予所有者和其他人执行权限并删除组的写权限:
ls -l somefile
-rw-rw-r-- 1 student student 1601 Mar 9 15:04 somefile
chmod uo+x,g-w somefile
ls -l somefile
-rwxr--r-x 1 student student 1601 Mar 9 15:04 somefile
其中 u 代表用户(所有者), o代表其他, g代表组。
这种语法可能很难键入和记住,因此经常使用一种简写形式,使您可以一步设置所有权限。这是通过简单的算法完成的,并且一位数字足以为每个实体指定所有三个权限位。该数字是以下各项的总和:
- 4如果需要读取权限
- 2如果需要写许可
- 如果需要执行许可,则为1。
因此,7表示读/写/执行,6表示读/写,5表示读/执行。
将其应用于chmod命令时,必须为每个自由度提供三位数,例如:
chmod 755 somefile
ls -l somefile
-rwxr-xr-x 1 student student 1601 Mar 9 15:04 somefile

让我们来看一个使用chown更改文件所有权的示例 , 如右侧的屏幕截图所示。首先,我们使用touch创建两个空文件 。注意,它需要sudo才能将file2的所有者更改 为root。第二个 chown命令同时更改所有者和组!
最后,只有超级用户才能删除文件。

现在,让我们看一个使用chgrp更改组所有权的示例:
第十三章 文本操作
1. cat命令和echo命令
无论您在Linux中扮演什么角色(系统管理员,开发人员或用户),您通常都需要浏览和解析文本文件,和/或从中提取数据。这些是文件操作操作。因此,Linux用户必须熟练地对文件执行某些操作。在大多数情况下,此类文件操作是在命令行上完成的,这使用户比使用GUI时更有效地执行任务。此外,命令行更适合于自动执行经常执行的任务。确实,经验丰富的系统管理员编写了定制的脚本来完成此类重复任务,并针对每个特定环境进行了标准化。我们将在后面详细讨论这种脚本。
在本节中,我们将重点介绍与命令行文件和文本操作相关的实用程序。
cat 是concatenate(连接的 )缩写,是最常用的Linux命令行实用程序之一。它通常用于读取和打印文件,以及仅用于查看文件内容。要查看文件,请使用以下命令:
cat <filename>
例如,cat readme.txt 将在终端上显示 readme.txt 的内容。但是,cat的主要目的 通常是将多个文件组合在一起。您可以使用cat执行表中列出的操作。

在tac命令(cat 反过来)以相反的顺序打印文件的行。每行保持不变,但行的顺序相反。tac 的语法与cat的语法完全相同,如下所示:
tac file
tac file1 file2 > newfile
如果未指定文件,则 cat可用于从标准输入(例如终端窗口)读取。您可以使用 >运算符来创建行并将其添加到新文件中,而可以使用 >>运算符将行(或文件)追加到现有文件中。我们在谈论如何在不使用编辑器的情况下创建文件时提到了这一点。
要创建新文件,请在命令提示符下键入cat> <filename>并按Enter键。
此命令将创建一个新文件,并等待用户编辑/输入文本。键入所需的文本后,在下一行的开头按CTRL-D以保存并退出编辑。
在终端上创建文件的另一种方法是cat> <filename> << EOF。将创建一个新文件,您可以键入所需的输入。要退出,请在行首输入EOF 。
请注意,EOF区分大小写。你也可以使用另一个词,例如STOP。

echo 仅显示(回显)文本。它的用法很简单,例如:
echo string
echo可用于在标准输出(即终端)上显示字符串,或用于放置在新文件中(使用 >运算符)或追加到已经存在的文件中(使用 >>运算符)。
的-e选项,用下面的开关一起用于使特殊字符序列,如换行字符或水平制表。
- \ n 代表换行符
- \ t 代表水平制表符。
echo 对于查看环境变量(内置的shell变量)的值特别有用。例如, echo $ USERNAME将显示已登录到当前终端的用户名。
下表列出了echo命令及其用法:

2. 大型压缩文件的管理
系统管理员需要使用配置文件,文本文件,文档文件和日志文件。这些文件中的某些文件可能随着时间累积数据而变得很大或变得非常大。这些文件将需要查看和管理更新。在本节中,您将学习如何管理如此大的文件。
例如,银行系统可能维护一个简单的大型日志文件,以记录一天中所有ATM交易的详细信息。由于安全攻击或故障,可能会迫使管理员通过在文件中导航来检查某些数据。在这种情况下,由于内存占用高,在编辑器中直接打开文件会引起问题,因为编辑器通常会首先尝试将整个文件读入内存。但是,可以使用 less 来查看如此大的文件的内容,并逐页向上和向下滚动,而无需在启动前系统将整个文件放入内存中。这比使用文本编辑器快得多。
可以通过键入以下两个命令之一来查看 somefile 文件:
less somefile |
cat somefile | less
默认情况下,手册页是通过 less 命令发送的。您可能会遇到较旧的实用程序,该实用程序具有相同的基本功能但功能较少:这就是 少即是多 的道理!
head 读取每个命名文件的前几行(默认为10),并将其显示在标准输出中。您可以在一个选项中提供不同数量的行。
例如,如果要打印grub.cfg前5行,请使用以下命令:
head –n 5 grub.cfg
您也可以输入head -5 grub.cfg。

tail 打印每个命名文件的最后几行,并将其显示在标准输出中。默认情况下,它显示最后10行。您可以选择不同数量的行。 当您使用日志文件解决任何问题时, tail尤其有用,因为您可能希望查看最新的输出行。
例如,要显示somefile.log的最后15行,请使用以下命令:
tail -n 15 somefile.log
*也可以只输入tail -15 somefile.log。
要持续监视不断增长的日志文件中的新输出:
tail -f somefile.log
该命令将显示somefile.log 中的任何新行。因此,它使您可以监视正在报告和记录的任何当前活动。

使用压缩文件时,许多标准命令不能直接使用。对于许多常用的文件和文本处理程序,还有一个专门设计用于直接处理压缩文件的版本。这些关联的实用程序的名称前都有字母“ z”。例如,我们有实用程序,例如 zcat,zless,zdiff 和zgrep。
下表列出了一些z系列命令:

请注意,如果您在未压缩的文件上运行zless,它仍然可以工作并且忽略解压缩阶段。除了gzip之外,还有用于其他压缩方法的等效实用程序 ,例如,我们将 bzcat 和bzless 与bzip2关联, 并将 xzcat和 xzless 与xz关联 。
3. sed命令和awk命令
创建然后重复编辑和/或提取文件内容的情况非常普遍。让我们学习如何使用sed和 awk 轻松执行此类操作。
请注意,许多Linux用户和管理员将使用Python和Perl等全面的脚本语言编写脚本,而不是使用 sed 和awk (以及稍后将讨论的其他实用程序)。在大多数情况下,使用这样的实用程序当然很好。人们应该始终可以随意使用经验丰富的工具。但是,这里描述的实用程序量级要轻得多。也就是说,它们使用较少的系统资源,并且执行速度更快。在某些情况下(例如在引导系统期间),使用更复杂的工具会浪费大量时间,并且系统甚至可能无法运行它们。因此,将始终需要更简单的工具。
sed 是功能强大的文本处理工具,并且是最古老,最早和最受欢迎的UNIX实用程序之一。它用于修改文件的内容,通常将内容放入新文件中。它的名称是流编辑器(stream editor)的缩写。
sed 可以过滤文本,以及在数据流中执行替换。来自输入源/文件(或流)的数据被获取并移动到工作空间。整个操作/修改列表将应用于工作空间中的数据,最终内容将移至标准输出空间(或流)。

您可以使用下表中列出的命令来调用sed :

该-e命令选项,可以在命令行中同时指定多个编辑命令。如果仅调用一个操作,则没有必要。

既然您知道可以使用sed执行多种编辑和过滤操作,那么让我们更详细地说明其中的一些。下表说明了一些基本操作,其中 pattern 是当前字符串, replace_string 是新字符串:

您必须谨慎使用-i选项,因为操作是不可逆的。 不用-i选项使用sed总是更安全,然后自己替换文件,如以下示例所示:
sed s / pattern / replace_string / g file1> file2
上述命令将file1中的所有 pattern替换为 replace_string 并输出内容到file2中。可以用cat file2 查看 file2 的内容。如果你愿意,则可以用mv file2 file1覆盖原始文件 。
示例:要将01/02 /…转换为JAN / FEB /…
sed -e 's/01/JAN/' -e 's/02/FEB/' -e 's/03/MAR/' -e 's/04/APR/' -e 's/05/MAY/' \
-e 's/06/JUN/' -e 's/07/JUL/' -e 's/08/AUG/' -e 's/09/SEP/' -e 's/10/OCT/' \
-e 's/11/NOV/' -e 's/12/DEC/'
awk 用于提取文件,然后打印文件的特定内容,通常用于构建报告。它是在1970年代由贝尔实验室创建的,其名称来源取自于作者的姓氏:Alfred Aho,Peter Weinberger和Brian Kernighan。
awk具有以下功能:
- 它是一种功能强大的实用程序,是一种解释型编程语言。
- 它用于处理数据文件,检索和处理文本。
- 它与字段(包含单个数据,本质上是一列)和记录(字段的集合,本质上是文件中的一行)一起很好地工作。
如下所示调用 awk:

与sed一样,可以在命令行直接指定简短的awk命令,但是可以将更复杂的脚本保存在可以使用-f选项指定的文件中。
下表说明了可以使用awk执行的基本任务。 一次读取输入文件一行,对于每一行,awk 以给定的顺序匹配给定的模式并执行请求的操作。该-F选项允许你指定一个特定的字段分隔符。例如,/ etc / passwd文件使用“ : ”分隔字段,因此-F:选项与/ etc / passwd文件一起使用。
awk中的命令/动作需要用撇号(或单引号('))引起来。 awk可以如下使用:

4. 文件处理实用程序
在管理文件时,您可能需要执行许多任务,例如对数据进行排序以及将数据从一个位置复制到另一位置。Linux提供了几种文件处理实用程序,您可以在使用文本文件时使用它们。在本节中,您将学习以下文件操作程序:
sortuniqpastejoinsplit
您还将了解正则表达式 和搜索模式。
sort 用于根据排序键以升序或降序重新排列文本文件的行。您还可以按文件的特定字段排序。默认的排序键是ASCII字符的顺序(即基本上按字母顺序)。
sort 可以如下使用:

当与使用 -u 选项,sort 排序记录(行)之后进行唯一值检查。这等效于对sort输出运行 uniq(我们将讨论)。

uniq 删除文本文件中重复的连续行,这对于简化文本显示很有用。
因为uniq 要求重复项必须连续,所以通常先运行sort ,然后将输出通过管道传递给 uniq。 如果将sort与-u 选项一起使用,则可以一步完成所有操作。
要一次从多个文件中删除重复的条目,请使用以下命令:
sort file1 file2 | uniq > file3 或 sort -u file1 file2 > file3
要计算重复条目的数量,请使用以下命令:
uniq -c filename

假设您有一个包含所有雇员全名的文件,另一个文件列出了他们的电话号码和雇员ID。您要创建一个新文件,其中包含三列中列出的所有数据:姓名,员工ID和电话号码。如何在不花费太多时间的情况下有效地做到这一点?
paste 可用于创建包含所有三列的单个文件。基于分隔符(用于分隔两个字段的间距)标识不同的列。例如,定界符可以是空格,制表符或 Enter。在提供的图像中,所有文件中的单个空格都用作分隔符。
paste 接受以下选项:
- -d 定界符 ,它指定要使用的定界符列表,而不是用于在一行上分隔连续值的制表符。每个定界符依次使用。列表用尽后,paste 将从第一个定界符再次开始。
- -s,这导致粘贴将数据串行而不是并行添加;也就是说,以水平而不是垂直的方式。

paste 可用于合并来自不同文件的字段(例如姓名或电话号码),以及合并来自多个文件的行。例如,file1的第一行与file2的第一行合并,file1的第二行与file2的第二行合并,依此类推。
要粘贴两个文件中的内容,可以执行以下操作:
paste file1 file2
使用其他定界符的语法如下:
paste -d,file1 file2
常见的分隔符是“空格”,“制表符”,“ |”,“逗号”等。

假设您有两个具有相似列的文件。您已将员工的电话号码保存在两个文件中,一个带有名字,另一个带有姓氏。您想要合并文件而不重复公共列的数据。您如何实现的?
可以使用join实现上述任务,join本质上是粘贴的增强版本。它首先检查文件是否共享公用字段,例如名称或电话号码,然后根据公用字段将行连接到两个文件中。

要在公共字段上合并两个文件,请在命令提示符下键入join file1 file2并按Enter键。
例如,电话簿和城市 文件之间的公共字段(即,包含相同的值)是电话号码,并且将这两个文件 join 在一起的结果显示在屏幕截图中。

split 用于将文件分割(或分割)成相等大小的段,以便于查看和操作,并且通常仅用于相对较大的文件。默认情况下, split将文件分成1000行的段。原始文件保持不变,并创建了一组具有相同名称和添加的前缀的新文件。默认情况下,添加 x前缀。要将文件拆分为段,请使用命令 split infile。
要将文件使用不同的前缀拆分为段,请使用命令split infile <Prefix>。

我们将对 超过99,000行的美英词典文件应用split:
wc -l american-english
99171 american-english
我们使用wc (字数,不久将讨论)在此报告文件中的行数。然后,键入:
split american-english dictionary
会将美式英语文件分成100个大小相等的段,名称为'dictionaryxx。最后一个当然会小一些。

正则表达式是用于匹配特定模式或搜索特定位置(例如,一行或一个单词的开头或结尾)的文本字符串。正则表达式可以同时包含普通字符或所谓的元字符,例如*和$。
许多文本编辑器和实用程序(例如vi, sed,awk,find和grep) 都使用正则表达式广泛地工作。一些使用正则表达式的流行计算机语言包括Perl,Python和Ruby。它可能变得相当复杂,并且整本书都写有关于正则表达式的内容。因此,我们只需要在此处略过表面即可。
这些正则表达式与bash等命令外壳中的文件名匹配中使用的通配符(或元字符)不同(在第7章:命令行操作中进行了介绍)。 该表列出了搜索模式及其用法。

例如,考虑以下句子: the quick brown fox jumped over the lazy dog
可以应用于此句子的某些模式如下:

5. grep命令和strings命令
grep 被广泛用作主要的文本搜索工具。它将扫描文件中的指定模式,并可以与正则表达式以及简单字符串一起使用,如下表所示:

strings 用于提取在作为参数指定的文件中找到的所有可打印字符串。在查找嵌入在二进制文件中的人类可读内容时很有用;对于文本文件,可以只使用 grep。
例如,要在电子表格中搜索字符串my_string :
strings book1.xls | grep my_string
屏幕快照显示了对许多程序的搜索,以查看哪些程序具有各种版本的GPL许可证。

6. 其他文本工具
在本节中,您将了解一些其他文本实用程序,可用于对Linux文件执行各种操作,例如更改字母大小写或确定文件中的单词,行数和字符数。

TR 实用程序用于指定的字符转换为其他字符或删除它们。通用语法如下:
tr [options] set1 [set2]
方括号中的项目是可选的。tr 至少需要一个参数,最多接受两个。在示例中第一个指定为set1 ,列出了要替换或删除的文本中的字符。第二个set2列出了要替换第一个参数中的字符。有时,这些集合需要用撇号(或单引号('))括起来,以使shell忽略具有特殊含义的shell字符。如下面示例所示,通常在每个集合周围使用单引号是安全的(可能是必需的)。
例如,假设您有一个名为city 的文件, 其中包含多行混合大小写的文本。要将所有小写字母转换为大写字母,请在命令提示符下键入cat city | tr a-z A-Z ,然后按Enter键。
tee 从任何命令获取输出,并且在将其发送到标准输出时,还将其保存到文件中。换句话说,它从命令“填充”输出流:一个流显示在标准输出上,另一个流保存到文件中。
例如,要在屏幕上列出目录的内容并将输出保存到文件,请在命令提示符下键入 ls -l | tee newfile ,然后按Enter键。
键入cat newfile 将显示 ls –l的输出。

wc (字数统计)计算文件或文件列表中的行数,单词数和字符数。下表中给出了选项。

默认情况下,这三个选项均处于活动状态。
例如,要仅打印文件中包含的行数,请键入wc -l filename并按Enter键。

cut 用于处理基于列的文件,并用于提取特定的列。默认的列分隔符是制表符。可以将不同的定界符作为命令选项给出。
例如,要显示由空格分隔的第三列,请在命令提示符下键入 ls -l | cut -d" " -f3 并按Enter键。

第十四章 网络管理
1. 网络地址与DNS
网络是通过通信通道(例如电缆或无线媒体)连接在一起的一组计算机和计算设备。通过网络连接的计算机可以位于同一地理区域中,也可以分布在世界各地。
网络用于:
- 允许连接的设备相互通信
- 使多个用户可以通过网络共享设备,例如打印机和扫描仪
- 跨计算机轻松共享和管理信息。
大多数组织都具有内部网络和Internet连接,以便用户与组织外部的机器和人员进行通信。互联网是世界上最大的网络,可以称为“网络的组网集合(the network of networks)”。
连接到网络的设备必须至少具有一个唯一的网络地址标识符,称为IP(互联网协议)地址。该地址对于通过网络路由信息包至关重要。跨网络交换信息需要使用小数据包流,每个小数据包都包含从一台机器到另一台机器的一条信息。这些数据包包含数据缓冲区以及标头,这些标头包含有关数据包去向和来自何处以及它在构成流的数据包序列中所处位置的信息。由于网络协议和软件必须处理的机器和操作系统的多样性,并且甚至必须支持非常老的标准,因此网络协议和软件也相当复杂。
有两种不同类型的IP地址可用:IPv4(版本4)和IPv6(版本6)。IPv4较旧,到目前为止使用更广泛,而IPv6较新,旨在克服旧标准固有的局限性,并提供更多可能的地址。
IPv4 使用32位作为地址;也有只有 43亿 可用的唯一地址。此外,许多地址是分配和保留的,但实际上并未使用。IPv4被认为不足以满足未来的需求,因为近年来全球网络上可用的设备数量已大大增加。
IPv6 使用128位地址。这样就可以使用3.4X10^38 个唯一地址。如果您的计算机网络较大,并且要添加更多计算机,则可能需要使用IPv6,因为它提供了更多唯一的地址。但是,迁移到IPv6可能很复杂。这两种协议并不总是可以很好地互兼容。因此,将设备和地址转移到IPv6需要大量的努力,并且没有达到最初的预期速度。与您讨论IPv4相比,我们将比IPv6讨论更多。
IPv4尚未消失的原因之一是有一些方法可以通过NAT(网络地址转换)之类的方法有效地使更多地址可用。通过NAT,可以在许多本地连接的计算机之间共享一个IP地址,每个计算机都有一个唯一的地址,只能在本地网络上看到。虽然在组织设置中使用了此选项,但在简单的家庭网络中也使用了它。例如,如果您有一个连接到Internet提供商(例如电缆系统)的路由器,它将为您提供一个外部可见的地址,但为家中的每个设备分配一个单独的本地地址。

一个32位的IPv4地址分为四个称为八位字节(Octet)(8 bit)部分。
示例:
IP地址→172.16.31.46
位格式→10101100.00010000.00011111.00101110
网络地址分为五类:A,B,C,D和E。类别A,B和C分为两部分:网络地址(网络ID)和主机地址(主机ID)。Net ID用于标识网络,而Host ID用于标识网络中的主机。D类用于特殊的多播应用程序(信息同时广播到多台计算机),E类保留供将来使用。在本节中,您将学习A,B和C类。

A类地址将IP地址的第一个八位位组用作其Net ID,并将其他三个八位位组用作主机ID 。第一个八位位组的第一位始终设置为零。因此,您只能将7位用于唯一的网络号。结果,最多有126个A类网络可用(地址0000000和1111111被保留)。不足为奇的是,这仅在很少有带有大量主机的唯一网络时才可行。随着Internet用途的扩展,增加了B级和C级,以适应对独立网络日益增长的需求。
每个A类网络在其网络上最多可以拥有1670万个唯一主机。主机地址的范围是1.0.0.0至127.255.255.255。
注意:一个八位位组的值或8位,范围可以从0到255。

B类地址将IP地址的前两个八位字节用作其Net ID,并将最后两个八位字节用作主机ID。第一个八位位组的前两位始终设置为二进制10,因此最多有16,384个(14位)B类网络。B类地址的第一个八位位组的值从128到191。B类网络的引入扩大了网络的数量,但是很快就知道需要进一步的处理。
每个B类网络最多可在其网络上支持65,536个唯一主机。主机地址的范围是从128.0.0.0到191.255.255.255。

C类地址使用IP地址的前三个八位位组作为其Net ID,最后一个八位位组用作其主机ID。第一个八位位组的前三位设置为二进制110,因此几乎有210万个(21位)C类网络可用。C类地址的第一个八位位组的值介于192到223之间。对于没有许多唯一主机的小型网络,这些值最为常见。
每个C类网络最多可支持256个(8位)唯一主机。主机地址的范围是192.0.0.0至223.255.255.255。

通常,组织的网络管理员会向Internet服务提供商(ISP)请求一系列IP地址。通常,你选择哪一个IP类的解决您将得到取决于网络的规模和预期增长的需求。如果NAT正在运行(例如在家庭网络中),则只能获得一个外部可见地址!
您可以手动或动态地通过网络为计算机分配IP地址。手动分配将静态(永不更改)地址添加到网络。动态分配的地址可以在每次重新启动时更改,甚至更频繁。动态主机配置协议(DHCP)用于分配IP地址。

名称解析用于将数字IP地址值转换为人类可读的格式,称为主机名。例如,104.95.85.15是数字IP地址,它引用主机名whitehouse.gov。主机名更容易记住!
给定一个IP地址,您可以获得其对应的主机名。当您可以键入主机名而不是IP地址时,通过网络访问计算机变得更加容易。
您只需输入不带参数的主机名即可查看系统的主机名 。
注意:如果提供参数,系统将尝试更改其主机名以使其匹配,但是,只有root用户可以执行此操作。
特殊的主机名localhost与IP地址127.0.0.1关联, 并描述了您当前所在的计算机(该计算机通常具有其他与网络相关的IP地址)。
2. 网络配置和网络工具
网络配置文件对于确保接口正确运行至关重要。它们位于 / etc 目录树中。但是,使用的确切文件历来取决于所使用的特定Linux发行版和版本。
对于Debian系列配置,可以在/ etc / network /下找到基本的网络配置文件 ,而对于Fedora和SUSE 系列系统,则需要检查/ etc / sysconfig / network。
现代系统强调使用网络管理器,我们在考虑图形系统管理时对此进行了简要讨论,而不是试图跟上/ etc中文件的变化 。尽管Network Manager的图形版本在不同的发行版中看起来确实有所不同,但是nmtui实用程序(如屏幕快照所示)几乎完全没有变化,甚至更稀疏的nmcli (命令行界面)实用程序也没有变化。如果您精通GUI的使用,请使用它们。如果您在各种系统上工作,则较低级别的实用程序可能会使生活更轻松。

网络接口是设备和网络之间的连接通道。从物理上讲,网络接口可以通过网络接口卡(NIC)进行处理,也可以抽象地实现为软件。您可以一次运行多个网络接口。可以随时启动(激活)或关闭(停用)特定接口。
ip和 ifconfig实用程序可以报告有关特定网络接口或所有网络接口的信息,您可能必须以超级用户身份运行它们,或者至少在某些发行版中提供完整路径,即 / sbin / ifconfig。 ip比ifconfig 更新,功能更多,但它的输出对人来说却很难阅读。一些新的Linux发行版未安装ifconfig所属的较早的 net-tools软件包 ,因此,如果要使用它,则必须安装它。

要查看IP地址:
/sbin/ip addr show
要查看路由信息:
/sbin/ip route show
ip是一个非常强大的程序,可以执行许多操作。诸如 ifconfig和 route之类的较旧(更具体)的实用程序 通常用于完成类似的任务。查看相关的手册页可以告诉您有关这些实用程序的更多信息。

ping 用于检查连接到网络的计算机是否可以接收和发送数据;即,它确认远程主机在线并且正在响应。
要检查远程主机的状态,请在命令提示符下键入ping <hostname>。
ping 通常用于网络测试和管理;但是,它的使用会增加网络负载,这是无法接受的。因此,您可以通过键入 CTRL-C或使用 -c选项来中止 ping的执行,这将限制 ping在退出之前将发送的数据包数量。当执行停止时,将显示摘要。

网络需要连接许多节点。数据通过一系列路由器并可能跨多个网络从源移动到目标。服务器维护 包含网络中每个节点的地址的路由表。IP路由协议使路由器能够建立将最终目的地与下一跳地址相关联的转发表。

可以使用 route实用程序 或较新的 ip route命令查看或更改IP路由表,以添加,删除或修改到特定主机或网络的特定(静态)路由。下表说明了一些可用于管理IP路由的命令:

traceroute 用于检查数据包到达目标主机的路由,这对于排除网络延迟和错误非常有用。通过使用traceroute,您可以隔离跃点之间的连接性问题,这有助于更快地解决它们。
要打印数据包采用的到达网络主机的路由,请在命令提示符下键入 traceroute <address>。

现在,让我们了解一些其他的联网工具。联网工具对于监视和调试网络问题(例如网络连接性和网络流量)非常有用。

3. 浏览器,wget命令和curl命令
浏览器通常在万维网上用于检索,传输和浏览信息资源。Linux用户通常同时使用图形和非图形浏览器应用程序。
Linux中使用的常见图形浏览器是:
- Firefox
- Google Chrome
- Chromium
- Epiphany (Web)
- Opera
有时,您要么没有可以使用的图形环境(或者有困难不能使用它),但仍然需要访问Web资源。在这种情况下,您可以使用非图形浏览器,例如:

有时,您需要下载文件和信息,但是浏览器并不是最佳选择,要么是因为您要下载多个文件和/或目录,要么是要从命令行或脚本执行操作。 wget 是一个命令行实用程序,可以处理以下类型的下载:
- 大文件下载
- 递归下载,其中网页引用其他网页,并且一次下载所有网页
- 密码要求的下载
- 多个文件下载。
要下载网页,您只需键入 wget <url>,然后就可以使用图形或非图形浏览器将下载的页面作为本地文件读取。

除了下载之外,您可能还希望获取有关URL的信息,例如正在使用的源代码。可以从命令行或脚本中使用curl 来读取此类信息。 curl 和wget一样,还允许您将网页的内容保存到文件中 。
您可以使用curl <URL>读取URL。例如,如果您想阅读http://www.linuxfoundation.org,请键入curlhttp://www.linuxfoundation.org。
要获取网页的内容并将其存储到文件中,请键入curl -o saved.html http://www.mysite.com。网站上主要索引文件的内容将保存在 saved.html中。

4. 文件传输
连接到网络后,可能需要将文件从一台计算机传输到另一台计算机。文件传输协议(FTP)是一种使用Internet在计算机之间传输文件的众所周知的流行方法。此方法建立在客户端-服务器模型上。FTP可以在浏览器中使用,也可以与独立的客户端程序一起使用。
FTP是最早的网络数据传输方法之一,其历史可以追溯到1970年代初。因此,它被认为不足以满足现代需求,并且本质上是不安全的。但是,它仍在使用中,并且当不考虑安全性时(例如,使用所谓的匿名FTP),这很有意义。但是,许多网站(例如kernel.org)已经放弃了其使用。

FTP客户端使您可以使用FTP协议与远程计算机传输文件。这些客户端可以是图形工具或命令行工具。例如,Filezilla允许使用拖放方法在主机之间传输文件。所有的网络浏览器都支持FTP,您所要做的就是输入ftp://ftp.kernel.org 之类的URL ,其中通常的http://变为ftp://。
一些命令行FTP客户端是:
- ftp
- ftp
- ncftp
- yafc(还有另一个FTP客户端)。
FTP在本质上是不安全的,因此在现代系统上已不受欢迎,因为密码是用户凭据,无需加密即可传输,因此容易被拦截。因此,例如为了使用rsync 和Web浏览器https访问而将其删除 。作为替代,sftp是一种非常安全的连接模式,它使用安全外壳(ssh)协议,我们将在稍后讨论。sftp对其数据进行加密,因此敏感信息可以更安全地传输。但是,它不适用于所谓的匿名FTP(来宾用户凭据)。

安全shell(SSH)是用于安全数据通信的加密网络协议。它也用于网络上两个设备之间的远程服务和其他安全服务,对于管理那些不易实际使用但可以远程访问的系统非常有用。
要使用相同的用户名登录到远程系统,只需键入 ssh some_system 并按 Enter 。 ssh 然后提示您输入远程密码。您还可以将 ssh 配置 为安全地允许您的远程访问,而无需每次都输入密码。
如果要以其他用户身份运行,可以执行ssh -l someone some_system或 ssh someone @ some_system。 要 通过SSH在远程系统上运行命令,请在命令提示符下键入ssh some_system my_command。

我们还可以使用安全复制(scp)在两个联网主机之间安全地移动文件。scp使用SSH协议传输数据。
要将本地文件复制到远程系统,请在命令提示符下,键入 scp <localfile> <user @ remotesystem>:/ home / user /,然后按Enter键。
您将收到提示输入远程密码的提示。您还可以配置scp,以便它在每次传输时都不提示输入密码。

本指南深入探讨Linux系统管理的关键方面,包括文件系统操作、文本编辑、用户环境配置、文本处理、网络管理和数据备份策略。涵盖了从文件系统架构到高级文本编辑器、用户账户管理、文本操作实用工具、网络配置及文件传输的全面内容。
2145

被折叠的 条评论
为什么被折叠?



