Contents

在Linux中并排显示文件

1. 概述

Linux 为我们提供了一些命令行工具来并排显示文件。在本教程中,我们将看看其中一些命令。

2. 示例文本文件

出于示例的目的,假设我们有两个文件。第一个文件inventory-1.txt包含以下内容:

$ cat inventory-1.txt
Optical Mouse 10
Ethernet Cables 33
Total Memory In All The Laptops In Bytes 68,719,441,551
23' Monitors 45
Graphic Cards 61

第二个文件inventory-2.txt的内容是:

$ cat inventory-2.txt
Ethernet Cables 33
23' Monitors 45
Graphic Cards 61
Wifi Dongles 23
Headphones 5

让我们看看如何在 Linux 中并排打开它们。

3. pr

pr 命令主要用于对文本文件进行分页。此外,它还可以合并多个文件,可选择将它们并排显示。让我们看一些例子。

3.1. 一般语法

pr命令具有以下语法:

pr [OPTION]... [FILE]...

第一个参数OPTION是一个标志列表,我们可以传递这些标志来修改pr命令的行为。

FILE参数是将由 pr命令预处理的文件列表。如果FILE参数不存在,或者值为“-”,则命令将从标准输入读取。

3.2. 并排显示文件

要并排显示inventory-1.txt和 inventory-2.txt,我们可以运行以下命令:

$ pr -m -t inventory-1.txt inventory-2.txt
Optical Mouse 10		    Ethernet Cables 33
Ethernet Cables 33		    23' Monitors 45
				    Graphic Cards 61
Total Memory In All The Laptops In  Wifi Dongles 23
23' Monitors 45			    Headphones 5
Graphic Cards 61

** -m标志使pr命令将两个文件合并到单个页面上的两列中**。如果没有该标志,pr会将两个文件连接成两页输出,而不是在列中显示它们。

此外,标志*-t*删除输出中的默认标题和换行符。

3.3. 增加列宽

默认情况下,** pr每行只打印 72 个字符,截断其余的**。因此,inventory-1.txt的第四行在前面的例子中被截断了。

为了增加页面宽度,我们将使用标志*-w*:

$ pr -m -t -w 120 inventory-1.txt inventory-2.txt
Optical Mouse 10					    Ethernet Cables 33
Ethernet Cables 33					    23' Monitors 45
							    Graphic Cards 61
Total Memory In All The Laptops In Bytes 68,719,441,551	    Wifi Dongles 23
23' Monitors 45						    Headphones 5
Graphic Cards 61

3.4. 使用fold应用自动换行

在上一节中,我们看到了如何使用*-w*标志来增加页面宽度。但是,如果文件中的行长于屏幕宽度,则单独增加页面宽度是徒劳的。

幸运的是,我们可以使用fold 命令首先将我们的文本文件包装到预定的页面宽度,然后将它们与pr合并:

$ pr -m -t -w 80 <(fold -w 40 inventory-1.txt) <(fold -w 40 inventory-2.txt)
Optical Mouse 10			Ethernet Cables 33
Ethernet Cables 33			23' Monitors 45
					Graphic Cards 61
Total Memory In All The Laptops In Byte Wifi Dongles 23
 68,719,441,551				Headphones 5
23' Monitors 45
Graphic Cards 61

首先,我们使用fold -w 40命令将inventory-1.txt和 inventory-2.txt的行包装成40 个字符的宽度。然后,我们将包装后的输出通过管道传递给pr命令。

结果,我们可以看到整个页面有 80 个字符宽度,每列占用 40 个字符宽度。此外,inventory-1.txt的第四行现在被包装而不是被截断。

4. sdiff

sdiff 是一个比较两个文件并显示它们之间差异的命令。如果打开并排的两个文件的目的是比较它们,则此工具很有用

使用sdiff命令需要注意的一件事是它只接受两个文件进行比较。因此,如果我们要打开两个以上的文件,则此命令不适合。

4.1. 一般语法

sdiff命令具有以下格式:

sdiff [OPTION]... FILE1 FILE2

OPTION是可用于配置命令的标志列表。 接下来,要比较的文件的名称作为参数FILE1FILE2传递。

4.2. 并排显示两个文件之间的差异

为了并排显示两个文件之间的差异,我们可以运行sdiff命令:

$ sdiff inventory-1.txt inventory-2.txt
Optical Mouse 10					      <
Ethernet Cables 33						Ethernet Cables 33
							      <
Total Memory In All The Laptops In Bytes 68,719,441,551	      <
23' Monitors 45							23' Monitors 45
Graphic Cards 61						Graphic Cards 61
							      |	Wifi Dongles 23
							      >	Headphones 5

从输出中,我们可以看到两个文件的内容是并排排列的。此外,我们可以观察到输出中有一些注释标记,例如“<”、“|”和“>”。

每个标记用于显示两个文件之间的差异:

  • 小于符号“<”:在 FILE1上存在但在FILE2上不存在的行上注释
  • 大于符号“>”:在 FILE2上存在但在 FILE1上不存在的行上注释
  • 管道符号“|”:在文件FILE1和 FILE2上不同的行上注释

5. paste

paste 命令是另一个方便的命令,它可以逐行合并文件,从而并行创建多个文件的组合。要了解有关paste命令的更多信息,请随时查看*paste *文章。

5.1. 一般语法

paste命令具有以下 一般语法:

paste [OPTION]... [FILE]...

该命令允许通过 OPTION参数传入标志。此外,要合并的文件的名称与参数FILE一起传递。

5.2. 逐行合并文件

要使用paste并排合并这两个文件 ,我们可以运行以下命令:

$ paste inventory-1.txt inventory-2.txt
Optical Mouse 10	Ethernet Cables 33
Ethernet Cables 33	23' Monitors 45
	Graphic Cards 61
Total Memory In All The Laptops In Bytes 68,719,441,551	Wifi Dongles 23
23' Monitors 45	Headphones 5
Graphic Cards 61	

从输出中,我们可以观察到 inventory-1.txt和 inventory-2.txt的内容已经被 paste逐行合并了。

5.3. 用column制表输出

尽管 paste命令并排显示两个文件,但输出未格式化。为了使其更具可读性,我们可以使用column 命令将其制成表格。

对于基于 Debian 的 Linux(例如 Debian 和 Ubuntu),我们需要首先使用apt-get安装命令:

$ apt-get update
$ apt-get install -y bsdmainutils

另一方面,基于 RedHat 的 Linux(例如 Fedora 和 CentOS)可以跳过安装,因为它默认与操作系统捆绑在一起。我们不会在本文中介绍apt-get工具,因为此站点上还有另一篇单独的文章 详细介绍了该工具。

要将 paste的输出制成表格,我们可以先用paste逐行合并文件 ,然后将输出通过管道传输到column命令以进行格式化。具体来说,在基于 Debian 的 Linux 中:

paste inventory-1.txt inventory-2.txt | column -t -s $'\t' -n

另一方面,基于 RedHat 的 Linux 可以在没有 -n 标志的情况下运行命令:

paste inventory-1.txt inventory-2.txt | column -t -s $'\t'

-t标志指示column命令通过使用分隔符作为指南创建列来将输入制成表格。然后,我们使用*-s*标志指定分隔符制表符。本质上,每当 命令在输入中看到制表符时,它都会将其后的序列视为新列。

最后,*在 基于 Debian 的 Linux 上需要-n*标志,以便将空单元格解释为有效单元格。**没有标志,输出将如下所示:

$ paste inventory-1.txt inventory-2.txt | column -t -s $'\t'
Optical Mouse 10                                         Ethernet Cables 33
Ethernet Cables 33                                       23' Monitors 45
Graphic Cards 61
Total Memory In All The Laptops In Bytes 68,719,441,551  Wifi Dongles 23
23' Monitors 45                                          Headphones 5
Graphic Cards 61

从输出中,我们可以看到column命令没有解释inventory-1.txt中的空行。因此,它会将inventory-2.txt中的相应行向左移动。

6. tmux

tmux 是一个强大的工具,它允许我们同时创建和使用多个终端。除了将文件并排显示之外,我们还可以使用系统中可用的任何文本编辑器来编辑它们。

6.1. 安装

首先,我们需要通过运行以下命令来安装tmux

$ apt-get update
$ apt-get install -y tmux

然后,我们可以通过获取tmux的版本来验证安装:

$ tmux -V
tmux 3.0a

如果返回版本,则安装成功。

6.2. 使用tmux并排显示文件

要同时显示 inventory-1.txt和 inventory-2.txt,我们可以运行以下命令:

$ tmux new-session \; send-keys 'cat inventory-1.txt' C-m \; split-window -h \; send-keys 'cat inventory-2.txt' C-m \;

上面的命令首先使用new-session参数在tmux上创建一个新会话。然后,它将catinventory-1.txt命令发送到创建的终端。字符 Cm在终端上执行发送的命令。

接下来,我们发出 split-window -h命令,它通过在第一个终端旁边创建一个新终端来水平拆分当前窗口。最后,我们在新终端上发出第二个cat inventory-2.txt命令

执行命令后,我们将有一个 包含两个并行窗口的tmux会话,如下图所示:

/uploads/files_display_compare/1.png

如果我们想编辑文件,我们可以用vivimnano等文本编辑器命令 替换cat命令

最后,要退出 tmux会话,只需按下键CTRL + bx。然后, 在提示终止会话时输入y