Linux 常用命令行文件比较

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在 Linux 环境中,比较文件是系统管理员和开发者的常见任务。comm 命令是一个强大的工具,它允许用户逐行比较两个已排序的文本文件,并找出它们之间的唯一行和共同行。

本实验将指导你使用 comm 命令来分析文本文件。你将学习如何创建测试文件、比较它们的内容,以及从比较结果中提取特定信息。在本实验结束时,你将深入了解如何在 Linux 中使用这个多功能命令来完成文件比较任务。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 100% 的好评率。

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/VersionControlandTextEditorsGroup(["Version Control and Text Editors"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/BasicFileOperationsGroup -.-> linux/wc("Text Counting") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") linux/TextProcessingGroup -.-> linux/sort("Text Sorting") linux/VersionControlandTextEditorsGroup -.-> linux/comm("Common Line Comparison") subgraph Lab Skills linux/echo -.-> lab-271251{{"Linux 常用命令行文件比较"}} linux/cat -.-> lab-271251{{"Linux 常用命令行文件比较"}} linux/wc -.-> lab-271251{{"Linux 常用命令行文件比较"}} linux/cd -.-> lab-271251{{"Linux 常用命令行文件比较"}} linux/mkdir -.-> lab-271251{{"Linux 常用命令行文件比较"}} linux/sort -.-> lab-271251{{"Linux 常用命令行文件比较"}} linux/comm -.-> lab-271251{{"Linux 常用命令行文件比较"}} end

准备你的文本文件

在使用 comm 命令之前,你需要创建一些示例文本文件。在这一步中,你将创建两个包含常见 Linux 命令列表的文本文件。

首先,创建一个工作目录来整理文件:

mkdir -p ~/project/comm-lab
cd ~/project/comm-lab

现在,创建第一个名为 commands1.txt 的文本文件,其中包含一个 Linux 命令列表:

echo -e "ls\ncd\npwd\nmkdir\ntouch\ncomm\nsed\nawk" | sort > commands1.txt

此命令的作用如下:

  • echo -e 输出带有反斜杠转义解释的文本(\n 用于创建新行)
  • 命令列表通过管道符 (|) 传递给 sort 命令,以按字母顺序对条目进行排序
  • 排序后的输出通过重定向符 (>) 保存到名为 commands1.txt 的文件中

接下来,创建第二个名为 commands2.txt 的文本文件,其中包含略有不同的命令列表:

echo -e "ls\ncd\npwd\ncomm\ngrep\nfind\nsed" | sort > commands2.txt

为了验证文件是否正确创建,可以使用 cat 命令查看其内容:

cat commands1.txt

你应该会看到以下输出:

awk
cd
comm
ls
mkdir
pwd
sed
touch

现在,检查第二个文件的内容:

cat commands2.txt

你应该会看到:

cd
comm
find
grep
ls
pwd
sed

注意,有些命令同时出现在两个文件中(如 cdlspwdcommsed),而其他命令则是每个文件独有的。这种设置将使你能够在接下来的步骤中演示 comm 命令的各种功能。

使用基本的 comm 命令

现在你已经准备好了排序好的文本文件,可以开始探索 comm 命令的基本用法了。comm 命令会逐行比较两个已排序的文件,并输出三列内容:

  1. 第一个文件独有的行
  2. 第二个文件独有的行
  3. 两个文件共有的行

运行基本的 comm 命令来比较这两个文件:

cd ~/project/comm-lab
comm commands1.txt commands2.txt

你应该会看到类似以下的输出:

awk
		cd
		comm
	find
	grep
		ls
mkdir
		pwd
		sed
touch

这个输出乍一看可能会让人困惑,但它遵循特定的格式:

  • 第一列(行首没有制表符):仅在 commands1.txt 中出现的行(awkmkdirtouch
  • 第二列(行首有一个制表符):仅在 commands2.txt 中出现的行(findgrep
  • 第三列(行首有两个制表符):两个文件共有的行(cdcommlspwdsed

这种默认输出能让你一次性看到所有的差异和相似之处,但由于制表符格式的原因,可能不太容易阅读。在下一步中,你将学习如何使用 comm 命令的选项让输出更实用。

使用 comm 选项隐藏列

comm 命令的默认输出由于采用列格式,可能不太容易阅读。不过,comm 提供了隐藏特定列的选项,这能让你更轻松地提取所需信息。

这些选项包括:

  • -1:隐藏第一列(第一个文件独有的行)
  • -2:隐藏第二列(第二个文件独有的行)
  • -3:隐藏第三列(两个文件共有的行)

这些选项可以组合使用,以便只显示你感兴趣的数据。

查找第一个文件独有的行

若要仅显示第一个文件(commands1.txt)独有的行,可以使用 -2-3 选项来隐藏第二列和第三列:

cd ~/project/comm-lab
comm -23 commands1.txt commands2.txt

输出结果:

awk
mkdir
touch

这些命令仅出现在 commands1.txt 中。

查找第二个文件独有的行

同样,若要仅显示第二个文件(commands2.txt)独有的行,可以使用 -1-3 选项:

comm -13 commands1.txt commands2.txt

输出结果:

find
grep

这些命令仅出现在 commands2.txt 中。

查找两个文件共有的行

若要仅显示两个文件共有的行,可以使用 -1-2 选项:

comm -12 commands1.txt commands2.txt

输出结果:

cd
comm
ls
pwd
sed

这些命令同时出现在两个文件中。

将结果保存到文件

通常,将这些结果保存到单独的文件中,以便日后参考或处理,会很有用。下面来进行操作:

comm -23 commands1.txt commands2.txt > unique_to_file1.txt
comm -13 commands1.txt commands2.txt > unique_to_file2.txt
comm -12 commands1.txt commands2.txt > common_lines.txt

来验证这些新文件的内容:

echo "Contents of unique_to_file1.txt:"
cat unique_to_file1.txt
echo "Contents of unique_to_file2.txt:"
cat unique_to_file2.txt
echo "Contents of common_lines.txt:"
cat common_lines.txt

输出将显示每个文件独有的行以及两个文件共有的行,就像之前命令中看到的那样。

这些技巧对于比较配置文件、查找文件不同版本之间的差异,或者识别数据集之间的共享元素非常有用。

comm 命令的实际应用示例

既然你已经了解了 comm 命令的基本用法,接下来让我们探讨一些实际示例,展示它在现实场景中的实用性。

示例 1:查找新条目

假设你有两份用户列表,一份是上周的,另一份是今天的。你想找出哪些用户是新添加的(即自上周以来新增的用户)。

创建这些文件:

cd ~/project/comm-lab
echo -e "user1\nuser2\nuser3\nuser4\nuser5" | sort > users_last_week.txt
echo -e "user1\nuser3\nuser5\nuser6\nuser7\nuser8" | sort > users_today.txt

要找出新用户(即在 users_today.txt 中但不在 users_last_week.txt 中的用户):

comm -13 users_last_week.txt users_today.txt

输出结果:

user6
user7
user8

示例 2:查找已移除的条目

使用相同的文件,找出自上周以来已被移除的用户:

comm -23 users_last_week.txt users_today.txt

输出结果:

user2
user4

示例 3:将 comm 与其他命令结合使用

comm 命令可以与其他命令结合使用,以执行更复杂的操作。例如,如果你想统计原始文件中有多少个共同的命令:

comm -12 commands1.txt commands2.txt | wc -l

这会将共同的行通过管道传递给 wc -l 命令,该命令用于统计行数。

输出结果:

5

这表明两个文件中有 5 个共同的命令。

示例 4:对未排序的文件使用 comm 命令

comm 命令要求输入的文件是已排序的。如果你尝试对未排序的文件使用该命令,可能会得到错误的结果。下面来演示一下:

echo -e "cat\nls\npwd\ncd" > unsorted1.txt
echo -e "ls\ncat\ngrep\npwd" > unsorted2.txt

如果直接使用 comm 命令:

comm unsorted1.txt unsorted2.txt

由于文件未排序,输出结果可能会产生误导。正确的做法是先对文件进行排序:

comm <(sort unsorted1.txt) <(sort unsorted2.txt)

这里使用了进程替换(process substitution),在比较文件之前先对其进行排序。你应该会看到格式正确且列显示正确的结果。

这些示例展示了 comm 命令在各种场景下比较文本文件的多功能性,例如跟踪更改、查找差异和过滤数据。

总结

在本次实验中,你学习了如何在 Linux 系统中使用 comm 命令来比较文本文件并找出它们之间的差异。以下是你所完成内容的总结:

  1. 使用基本的 Linux 命令创建用于比较的已排序文本文件
  2. 使用基本的 comm 命令比较两个文件,并理解其三列输出格式
  3. 应用列隐藏选项(-1-2-3)来提取特定信息:
    • 第一个文件独有的行
    • 第二个文件独有的行
    • 两个文件共有的行
  4. 将比较结果保存到单独的文件中,以备将来参考
  5. 探索了 comm 命令在实际场景中的应用示例:
    • 在更新后的列表中查找新条目
    • 识别已移除的条目
    • comm 命令与其他命令结合使用,以执行更复杂的操作
    • 正确处理未排序的文件

comm 命令是 Linux 系统中用于比较文本文件的强大工具。它使系统管理员、开发人员和数据分析师能够高效地识别文件之间的差异和相似之处,这对于配置管理、版本控制和数据分析等任务至关重要。

理解如何有效地使用 comm 命令及其选项,将提高你在 Linux 命令行环境中处理文本文件时的工作效率。