比较文本文件的版本通常很有用。
对于系统管理员和软件开发人员来说,这一点尤为重要。
例如,系统管理员可能需要将现有配置文件与先前版本进行比较以诊断系统问题。
同样,程序员经常需要查看随着时间的推移对程序进行了哪些更改。
comm 实用程序显示两个排序文件的逐行比较。
它显示的三列中的第一列列出仅在 file1 中找到的行,第二列列出仅在 file2 中找到的行,第三列列出两个文件共有的行。
“comm”命令的基本语法是:
# comm [options] file1 file2
选项options
我们可以组合这些选项。
在没有选项的情况下, comm 产生三列输出。
选项 | 作用 |
---|---|
-1 | 不显示第 1 列(不显示仅在 file1 中找到的行)。 |
-2 | 不显示第 2 列(不显示仅在 file2 中找到的行)。 |
-3 | 不显示第 3 列(不显示在两个文件中找到的行)。 |
-i | 不区分大小写的行比较。 |
- -check-order | 检查输入的顺序,即使所有输入线都是可配对的 |
- -nocheck-order | 忽略输入的顺序 |
- -output-delimiter=STR | 用分隔符STR分隔列; |
- -help | 显示帮助菜单 |
- -version | 显示命令版本信息 |
注意:如果文件没有被排序,comm 将不能正常工作。
第二列中的行以一个 TAB 开头,第三列中的行以两个 TAB 开头。
退出状态指示通信是正常(0)还是异常(非 0)完成。
在 Linux 中的“comm”命令示例
示例 1:基本用法
让我们看一个“comm”命令的基本示例来比较 2 个排序文件。
文件如下所示:
# cat file1 aa bb cc dd
# cat file2 cc xx yy zz
comm 命令逐行比较文件并输出任何相同的行。
例如:
# comm file1 file2 aa bb cc dd xx yy zz
此命令输出显示为三列:第 1 列仅显示文件 1 中的行(aa、bb、dd),第 2 列仅显示文件 2 中的每一行(xx、yy、zz),第 3 列显示每行之间相同的行两个文件 (cc)。
这是一个比 diff 更详细的比较,当我们只想查找或者检查一两个简单的更改时,输出可能会让人不知所措。
但是,当我们对这两个文件都不太熟悉并想查看它们之间的比较时,它会非常有用。
示例 2:抑制 couns
comm 支持 -n 形式的选项,其中 n 是 1. 2 或者 3.
使用时,这些选项指定要抑制的列。
例如,如果我们只想输出两个文件共享的行,我们将抑制第 1 列和第 2 列的输出:
# comm -12 file1 file2 cc
同样,我们只能使用以下命令分别显示仅出现在 file1 和 file2 中的行。
# comm -23 file1 file2 aa bb dd
# comm -13 file1 file2 xx yy zz
示例 3:对输入进行排序检查
comm 命令提供了 2 个选项来检查已排序的输入:
- -check-order
- -nocheck-order
-check-order 选项在比较之前检查输入是否正确排序。
如果输入没有排序,你会得到如下所示的错误:
# comm --check-order file1 file2 aa bb cc dd xx comm: file 2 is not in sorted order
而 -nocheck-order 选项允许文件比较,即使输入不是排序格式。
例如:
# cat file1 aa bb cc dd
# cat file2 xx cc yy zz
# comm --nocheck-order file1 file2 aa bb cc dd xx yy zz
示例 4:分隔输出
comm 还提供了使用用户提供的分隔符来分隔输出的选项。
例如,我们可以使用诸如“|”之类的分隔符来代替默认的“制表符”分隔输出(管道)如下例所示:
# comm --output-delimiter="|" file1 file2 aa bb ||cc dd |xx |yy |zz
参数
file1 和 file2 参数是 comm 比较的文件的路径名。
使用连字符 (–) 代替 file1 或者 file2 会导致 comm 读取标准输入而不是该文件。
comm VS diff
comm 与 diff 相似,因为这两个命令都比较两个文件。
但是 comm 也可以像 uniq 一样使用; comm 在两个排序文件之间选择重复或者唯一的行,而 uniq 在同一个排序文件中选择重复或者唯一的行。