介绍
本实验将带你了解 Linux 中必不可少的文本处理命令:tr、col、join 和 paste。你将学习如何使用这些工具高效地操作文本文件,它们是完成许多 Linux 任务的基础。本指南专为初学者设计,提供了详细的解释和示例,帮助你透彻理解每个命令。
使用 tr 命令
tr 命令是「translate」(转换)的缩写,是一个用于在文本流中转换或删除字符的强大工具。它在转换大小写、删除特定字符或替换字符等任务中非常有用。
让我们从一些基础的 tr 操作开始:
- 从字符串中删除特定字符:
echo 'hello labex' | tr -d 'olh'
此命令将从输入字符串中删除所有出现的「o」、「l」和「h」。具体原理如下:
echo 'hello labex'输出文本「hello labex」。|(管道)符号将此输出发送给tr命令。tr -d 'olh'告诉tr删除(-d)它找到的任何「o」、「l」或「h」字符。
你应该会看到 e abex 作为输出。注意所有的「o」、「l」和「h」字符都已被移除。
- 移除重复字符:
echo 'hello' | tr -s 'l'
此命令将压缩(-s)或移除输入字符串中重复的字母「l」。你应该会看到 helo 作为输出。
echo 'balloon' | tr -s 'o'
你应该会看到 ballon 作为输出。重复的「o」已被压缩为单个「o」。
- 将文本转换为大写:
echo 'hello labex' | tr '[:lower:]' '[:upper:]'
此命令将所有小写字母转换为大写。具体原理如下:
'[:lower:]'是一个代表所有小写字母的字符类。'[:upper:]'是一个代表所有大写字母的字符类。- 该命令告诉
tr将第一组中的任何字符替换为第二组中对应的字符。
你应该会看到 HELLO LABEX 作为输出。
尝试这些命令并观察输出。如果你犯了错误也不要担心——你可以随时重新运行命令。如果你好奇会发生什么,可以尝试更改输入文本或 tr 命令中的字符。
例如,你认为运行以下命令会发生什么:
echo 'hello world' | tr 'ol' 'OL'
动手试一试吧!
如果你想了解更多关于 tr 的信息,可以使用 man tr 查看其手册页。这将为你提供 tr 所有选项和用途的详尽列表。要退出手册页,只需按「q」。
请记住,在 Linux 中,大多数命令都遵循类似的结构:command [options] arguments。理解这一模式将有助于你学习更多命令。
探索 col 命令
col 命令用于过滤输入中的反向换行符。它在将制表符(Tab)转换为空格(反之亦然)时特别有用。当处理格式可能不一致的文件时,尤其是跨不同操作系统移动文件时,经常会用到这个命令。
让我们看看 col 的实际应用:
- 首先,让我们查看一个带有制表符的文件内容:
cat -A /etc/protocols | head -n 10
此命令执行以下操作:
cat用于显示文件内容。-A选项告诉cat显示所有字符,包括不可打印字符。/etc/protocols是我们要查看的文件(这是一个列出互联网协议的系统文件)。|将输出通过管道传输到下一个命令。head -n 10仅显示输出的前 10 行。
你会在输出中看到 ^I 字符。这些代表制表符。^ 符号用于表示控制字符,而 I(字母表第 9 个字母)代表制表符的 ASCII 字符(其十进制值为 9)。
- 现在,让我们使用
col将这些制表符转换为空格:
cat /etc/protocols | col -x | cat -A | head -n 10
这个命令管道执行以下操作:
cat /etc/protocols输出文件内容。|将输出传给col。col -x将制表符转换为空格。-x选项告诉col执行此转换。- 另一个
|将输出传给cat -A以显示所有字符。 head -n 10显示前 10 行。
将输出与之前的命令进行比较。你会发现 ^I 字符已被空格替换。
-x 选项在需要确保不同系统或文本编辑器(它们处理制表符的方式可能不同)之间格式一致时非常有用。
如果你好奇 col 还有哪些其他选项,可以使用 man col 查看其手册页。记住,按「q」可以退出。
使用 join 命令
join 命令用于根据共同字段合并两个文件的行。它类似于数据库中的连接(Join)操作。当你有关联的数据分布在多个文件中,并希望根据共同的键或标识符将它们合并时,这个命令非常有用。
让我们创建两个简单的文件并合并它们:
- 创建第一个文件:
echo -e "1 apple\n2 banana\n3 cherry" > fruits.txt
此命令执行以下操作:
echo用于输出文本。-e启用反斜杠转义解释。\n代表换行。>将输出重定向到名为fruits.txt的文件。
- 创建第二个文件:
echo -e "1 red\n2 yellow\n3 red" > colors.txt
这创建了另一个具有匹配编号但第二个字段不同的文件。
- 现在,让我们合并这些文件:
join fruits.txt colors.txt
此命令将根据第一个字段(编号)合并两个文件的行。
你应该会看到如下输出:
1 apple red
2 banana yellow
3 cherry red
join 命令根据第一个字段(编号 1, 2, 3)匹配行,并将两个文件中的其余字段组合在一起。
- 你还可以指定用于合并的字段。例如:
join -1 2 -2 2 <(sort -k2 fruits.txt) <(sort -k2 colors.txt)
这个更复杂的命令执行以下操作:
-1 2告诉join使用第一个文件的第二个字段进行合并。-2 2告诉join使用第二个文件的第二个字段进行合并。<(...)是进程替换,允许我们在需要文件名的地方使用命令的输出。sort -k2根据第二个字段对文件进行排序。
我们需要先对文件进行排序,因为 join 要求输入在合并字段上是有序的。
如果两个文件之间没有匹配的第二个字段,此命令可能不会产生任何输出。这是 join 在没有匹配项时的预期行为。
如果你想查看排序是如何工作的,可以分别尝试这些命令:
sort -k2 fruits.txt
sort -k2 colors.txt
请记住,join 对输入文件中行的顺序很敏感。如果文件没有在合并字段上排序,你可能会得到意外的结果或根本没有输出。
使用 paste 命令
paste 命令用于合并文件的行。与 join 不同,它不需要共同字段。当你想要并排合并文件或从多个文件创建类似表格的输出时,它非常有用。
让我们看看 paste 是如何工作的:
- 创建三个简单的文件:
echo -e "apple\nbanana\ncherry" > fruits.txt
echo -e "red\nyellow\nred" > colors.txt
echo -e "sweet\nsweet\nsweet" > tastes.txt
这些命令创建了三个文件,每个文件有三行。
- 现在,让我们使用
paste合并这些文件:
paste fruits.txt colors.txt tastes.txt
此命令将并排合并所有三个文件的行。你应该会看到如下输出:
apple red sweet
banana yellow sweet
cherry red sweet
默认情况下,paste 使用制表符来分隔字段。
- 我们也可以指定不同的分隔符:
paste -d ':' fruits.txt colors.txt tastes.txt
-d ':' 选项告诉 paste 使用「:」作为不同文件字段之间的分隔符。你应该会看到如下输出:
apple:red:sweet
banana:yellow:sweet
cherry:red:sweet
- 最后,让我们尝试
-s选项,它会将合并操作序列化:
paste -s fruits.txt colors.txt tastes.txt
-s 选项告诉 paste 将每个文件的内容合并为单行。你应该会看到如下输出:
apple banana cherry
red yellow red
sweet sweet sweet
输出中的每一行代表一个完整文件的内容。
当你处理需要以各种方式组合的数据时,这些 paste 操作非常有用。例如,你可以使用 paste 合并日志文件、创建 CSV 文件或格式化数据以便其他程序处理。
记住,如果你想探索 paste 的更多选项,可以随时使用 man paste 查看其手册页。
文本处理的乐趣
既然你已经学习了这些文本处理命令,让我们来找点乐子!我们将安装并玩一个名为 Space Invaders(太空侵略者)的文本游戏。这将展示文本处理如何创造性地应用于 Linux 环境。
- 首先,让我们更新软件包列表:
sudo apt-get update
此命令更新可用软件包及其版本的列表。在安装新软件之前运行此命令是一个好习惯。
sudo以超级用户权限运行命令。apt-get是 Ubuntu 中的软件包处理工具。update告诉 apt-get 更新软件包列表。
- 现在,让我们安装游戏:
sudo apt-get install ninvaders -y
此命令安装 ninvaders 游戏。
install告诉 apt-get 安装新软件包。ninvaders是我们要安装的软件包名称。-y自动对安装过程中的任何提示回答「yes」。
如果你好奇 apt-get 还有哪些其他选项,可以使用 man apt-get 查看其手册页。
- 安装完成后,你可以启动游戏:
ninvaders
此命令启动 Space Invaders 游戏。操作方法如下:
- 使用左右方向键移动你的飞船。
- 按空格键射击。
- 按「p」暂停游戏。
- 按「q」退出游戏。
尝试玩几分钟。你能打破最高分吗?

这个游戏是文本如何被操作以在终端中创建交互式体验的绝佳示例。它使用简单的 ASCII 字符来代表飞船、外星人和子弹,证明了即使是复杂的交互也可以仅使用文本来表示。
玩完后,记得按「q」退出游戏。
总结
在本实验中,你学习了 Linux 中几个强大的文本处理命令:
tr:用于在文本中转换或删除字符。你用它删除了特定字符、移除了重复项并更改了文本大小写。col:用于在制表符和空格之间转换。你用它查看并操作了系统文件中的制表符。join:用于根据共同字段合并两个文件的行。你创建了示例文件并根据不同字段合并了它们。paste:用于合并文件的行。你创建了多个文件并使用不同的paste选项以各种方式组合它们。
这些命令是 Linux 文本处理工具箱中的基本工具。它们可以以各种方式组合,以高效地操作和分析文本数据。以下是一些关键要点:
- Linux 将一切视为文件,许多配置文件都是文本格式。
- 管道(
|)符号在链接命令时非常强大。 - 许多 Linux 命令遵循类似的结构:
command [options] arguments。 - 手册页(
man命令)是学习任何命令的绝佳资源。
最后,我们通过安装和玩文本游戏探索了文本处理的创意用途。这展示了 Linux 环境中文本的多功能性——即使是复杂的交互式应用程序也可以仅使用文本字符构建!
随着你继续 Linux 之旅,你会发现这些文本处理技能在系统管理、数据分析甚至编程任务的许多方面都非常有价值。继续练习这些命令,你将变得更加精通 Linux 文本处理!
记住,最好的学习方式就是实践。不要害怕尝试这些命令,尝试不同的选项,看看会发生什么。祝你文本处理愉快!



